Sql语句中,Contains与Like查询结果不相同的问题

王尼瑪 2012-03-29 03:30:52
我们知道,要模糊查询数据表的话,一般会用到Like语法,而对数据表相应的字段进行全文索引之后,还可以使用速度更快的Contains方法、

但是,我发现,分别使用这两个方法查询出来的结果不一致!

select CompanyName from T_Enterprise where CompanyName like '%CCC%'

查询结果:
CompanyName
-------------------------------- 可以查到
CCCCCCCCC

select CompanyName from T_Enterprise where Contains(CompanyName,'CCC')
查询结果:
CompanyName
--------------------------------查不到数据

备注:该表已经进行全文索引!

再换另外一个关键字来查询下、

select COUNT(*) from T_Enterprise where CompanyName like '%公司%'

select COUNT(*) from T_Enterprise where Contains(CompanyName,'公司')

结果是使用Contains查询的记录数比Like少!

请教大牛们!!
...全文
8829 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
王尼瑪 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

WHERE CONTAINS( address, '*"包包"*' ) 这样子写法就可以了。

请留意双引号与星号的位置。

但是,程序上不知道怎样拼接字符串了。。。
[/Quote]

擦。双引号要用中文输入法才行。。。。
王尼瑪 2012-03-30
  • 打赏
  • 举报
回复
WHERE CONTAINS( address, '*"包包"*' ) 这样子写法就可以了。

请留意双引号与星号的位置。

但是,程序上不知道怎样拼接字符串了。。。
shshjun 2012-03-30
  • 打赏
  • 举报
回复
可以参考一下这个http://blogs.msdn.com/b/sqlfts/archive/2009/12/03/did-you-know-that-sql-server-2008-provides-the-ability-to-create-a-custom-dictionary-of-special-terms-to-be-indexed-as-is-i-e-at-t-into-the-ftindex.aspx.

“包包”可能没有在字典里面.所以他查不出来.我自己没有试过自定义字典.目前没有2008手边.
王尼瑪 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

contains 是全文索引的函数吧,
1、全文索引是以词为单位的,
2、全文索引中有干扰词

例如 你contains 查询包含上海的 可以查出来,但是你使用contains 查询 上 就可能什么也查不出来
[/Quote]

我现在就是查询“包包”这个关键字,要连续出现这两个字的,但是,1个“包”字也出现了。并不是我想要的数据。
  • 打赏
  • 举报
回复
contains 是全文索引的函数吧,
1、全文索引是以词为单位的,
2、全文索引中有干扰词

例如 你contains 查询包含上海的 可以查出来,但是你使用contains 查询 上 就可能什么也查不出来
王尼瑪 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

按理说contains是模糊匹配,其结果会多余like,实际看起来contains匹配的最小单位是单词才导致这个结果的?
[/Quote]

我也搞不懂!顶上去!!
王尼瑪 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

按理说contains是模糊匹配,其结果会多余like,实际看起来contains匹配的最小单位是单词才导致这个结果的?
[/Quote]

我也搞不懂?怎么没有sqlserver牛人来回答?顶上去。
xptking 2012-03-30
  • 打赏
  • 举报
回复
按理说contains是模糊匹配,其结果会多余like,实际看起来contains匹配的最小单位是单词才导致这个结果的?
王尼瑪 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SQL code

mssql全文检索CONTAINS的用法.

全文索引——CONTAINS 语法
我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。

我们通过例子来学习,假设有表 students,其中的 address……
[/Quote]


使用这个方法可以,原来要加上双引号 和 * 号的。
WHERE CONTAINS( address, '"hu*"' )

但是,又发现了一个问题,比如我要搜索 “包包”这个词组,那应该是
WHERE CONTAINS( address, '"*包包*"' ) 这样子写法吧!

但是,记录中,只有一个“包”字的数据都查出来了。msdn 百度了很久,都搞不掂。
dawugui 2012-03-29
  • 打赏
  • 举报
回复
select COUNT(*) from T_Enterprise where CompanyName like N'%公司%'

select COUNT(*) from T_Enterprise where Contains(CompanyName,N'公司')

  • 打赏
  • 举报
回复

mssql全文检索CONTAINS的用法.

全文索引——CONTAINS 语法
我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。

我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。
1. 查询住址在北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )
remark: beijing是一个单词,要用单引号括起来。

2. 查询住址在河北省的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。

3. 查询住址在河北省或北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )
remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。

4. 查询有 '南京路' 字样的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'nanjing NEAR road' )
remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。
A NEAR B,就表示条件: A 靠近 B。

5. 查询以 '湖' 开头的地址
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"hu*"' )
remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。
记住是 *,不是 %。

6. 类似加权的查询
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )
remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。

7. 单词的多态查询
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )
remark: 查询将返回包含 'street','streets'等字样的地址。
对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
黄_瓜 2012-03-29
  • 打赏
  • 举报
回复
CONTAINS 谓词可以搜索:

1、词或短语。


2、词或短语的前缀。


3、与另一个词相邻的词。


由另一个词的词形变化而生成的词(例如,drive 一词是 drives、drove、driving 和 driven 词形变化的词干)。


4、使用同义词库确定的另一个词的同义词(例如,metal 一词可能有 aluminum 和 steel 等同义词)。


注意他和like 区别很大的 性质不一样的,like 是用来匹配的。
黄_瓜 2012-03-29
  • 打赏
  • 举报
回复
CONTAINS 谓词可以搜索:

1、词或短语。


2、词或短语的前缀。


3、与另一个词相邻的词。


由另一个词的词形变化而生成的词(例如,drive 一词是 drives、drove、driving 和 driven 词形变化的词干)。


4、使用同义词库确定的另一个词的同义词(例如,metal 一词可能有 aluminum 和 steel 等同义词)。


注意他和like 区别很大的

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧