SQL SERVER 模糊搜索
在SQL语句中,模糊搜索很有意思,如果你用ACCESS数据库,那么备注型数据可以用 text = '' 来搜索text字段为空的数据,而在SQL SERVER中这个语句将失去效力,ACCESS中的备注到SQL中一般为ntext,在SQL中你必须使用LIKE运算符才OK,前面的语句必须改为 text like '',SQL对于text 、ntext、image数据类型都是如此,如果你要搜索一个非空的话,必须使用not like '',否则执行错误。在这一点上,我觉得MS SQL是高级一些的。|
而且我发现一点,ACCESS对于一些非ANSI的字符,LIKE运算符将失效。http://www.hzqn.com/以前就存在这样的问题,他们的歌曲搜索没有用。那都是日本鬼子害的!因为问题就出在一些日文歌曲的名字非法!!!不过这个问题在MS SQL得到很好的解决,嘻嘻~~~~
========================================================
急!!请大侠们告之怎样像那种模糊搜索,如:输入搜索关键词,“从事职业”也能搜出“大家好,你从事什么职业”记录
类似这个帖子看一下
http://search.csdn.net/Expert/topic/2521/2521969.xml?temp=.4280054
--建立测试环境
Create Table TEST(ID Int,TestText Nvarchar(100))
Insert TEST Values(1,N'大家好,你从事什么职业')
Insert TEST Values(2,N'你来自何方')
Insert TEST Values(3,N'我从事的职业是')
Insert TEST Values(4,N'我在中国')
--测试
Declare @SearchText Nvarchar(100)
Set @SearchText=N'从事职业'
Select * from TEST Where TestText Like '%['+@SearchText +' ]%'
--删除测试环境
Drop Table TEST
--结果
/*
IDTestText
1大家好,你从事什么职业
3我从事的职业是
*/
=====================
如何用SQL语句实现精确搜索以及模糊搜索
在写WEB项目的时候,搜索是必须提供的功能
有时候,客户会输入用空格或其他分隔符分隔的一组关键词,我们需要根据输入找出以下结果:
绝对包含整组关键词连续出现的结果
包含整组关键词里每个词条,但是不一定连续出现的结果
包含整组关键词里任一条或多条关键词的结果
就像你在GOOGLE里搜索SQL SERVER 2000,
它首先严格匹配整个字符串
在找不到的情况下,看有没有包含这三个单词的结果
如果连三个单词都包含的结果都没有,就试着找出包含任一个词的结果
下面的代码是用C#在代码中动态构建这种搜索模式的条件语句的函数
其中KEYWORD就是关键词了
SEARCHMODE就是搜索模式了,1代表精确,2,代表全包含 ,3代表任意包含
string strCondition="Id in (";
string strSubQuery="select distinct productid from productcateview where id<>0 ";
if(Request.QueryString["Country"]!=null)
strSubQuery+=" and industryRegionId="+Request.QueryString["Country"];
if(Request.QueryString["Industry"]!=null)
strSubQuery+=" and IndustryId="+Request.QueryString["Industry"];
if(Request.QueryString["Keyword"]!=null)
{
//SearchMode:搜索模式,1,代表精确搜索,2代表同时包含搜索3,代表的是包含任一单词的搜索
string strKeyword=Server.UrlDecode(Request.QueryString["Keyword"].Replace("'","''"));
string strTemp="";
strSubQuery+=" and (";
string [] KeywordArray;
if(strKeyword.IndexOf(',')!=-1)
KeywordArray=strKeyword.Split(',');
else
if(strKeyword.IndexOf('|')!=-1)
KeywordArray=strKeyword.Split('|');
else
KeywordArray=strKeyword.Split(null);
//分主关键词
if(KeywordArray.Length<2||strSearchMode=="1")
{
strSubQuery+="( productfullname+' '+cast(shortdesc as varchar)+' '+keyword+' '+subcategoryname like '%"+strKeyword+"%')";
}
else
{
if(strSearchMode=="2")
{
strTemp="productfullname+' '+cast(shortdesc as varchar)+' '+keyword+' '+subcategoryname like '";
string strSqlKeyword="";
for (int i=0;i<KeywordArray.Length;i++)
{
strSqlKeyword+="%"+KeywordArray[i];
}
strTemp+=strSqlKeyword+"%'";
}
if(strSearchMode=="3")
{
strTemp="";
for (int i=0;i<KeywordArray.Length;i++)
{
strTemp+=" productfullname+' '+cast(shortdesc as varchar)+' '+keyword+' '+subcategoryname like '%"+KeywordArray[i]+"%' or";
}
strTemp=strTemp.TrimEnd(new char[] {'o','r'});
}
strSubQuery+=strTemp;
}
strSubQuery+=")";
}
strCondition+=strSubQuery;
strCondition+=")";
return(strCondition);
三种模式中,第一种会构造出类似下面的SQL条件
Field1+field2+field3 like %keyword%
第二种构造出
field1+field2+field3 like %keyword1%keyword2%keyword3%
第三种构造出
field1+field2+field3 like %keyword1% or field1+field2+field3 like %keyword2% or field1+field2+field3 like%keyword3%
这三种模式来
其中KEYWORD1,KEYWORD2,KEYWORD三就是用KEYWORD分隔出来的单词了
一般可以假定客户用空白字符,OR,|或者,或者;来分隔
不过,一般来说,客户总是会用空格来分隔的