SQL CONTAINS或FREETEXT

时间:2011-08-23 18:57:02

标签: sql sql-server-2008

我试图在SQL编程中使用CONTAINS或FREETEXT,以便能够同时搜索所有单词。问题是当你搜索几个单词时,FREETEXT或CONTAINS将按行而不是按行搜索,例如:
想象一下这是我的数据库

id        | c1      | c2 
===============================
a         | 1       | 2     
b         | 1       | 3     
c         | 1       | 2     
d         | 2       | 2     
e         | 3       | 3     
f         | 2       | 1 

当您搜索CONTAINS(*, '1,2')或关闭诅咒FREETEXT(*, '1 2')时,它将返回

id        | c1      | c2 
===============================
a         | 1       | 2     
b         | 1       | 3     
c         | 1       | 1     
d         | 2       | 2     
e         | 2       | 3     
f         | 2       | 1 

基本上是整个数据库。但我想要的是这个

id        | c1      | c2 
===============================
a         | 1       | 2     
f         | 2       | 1 

哪个行包含1和2的组合。

顺便说一句,我使用的是SQL 2008和ASP classic。

我非常感谢您的建议。

2 个答案:

答案 0 :(得分:1)

我经常遇到这个问题。我使用的解决方案从来没有真正满足我的性能,但它确实有效。它正在加强我正在寻找的价值观。

SELECT *
FROM (
    SELECT (T.C1 + '-' + T.C2) AS C3, *
    FROM TABLE T
    WHERE T.C1 IN (ALL VALUES FOR C1)
) T2
WHERE T2.C3 IN (ALL CONCATENATED VALUES)

如果类型是数字,您应该使用CONVERT或CAST到VARCHAR。

希望这有帮助。

编辑:由于缺少索引,我使用了包含错误。改为IN。

答案 1 :(得分:0)

尝试CONTAINS(*, ' "1" AND "2" ')

编辑 -

如果你想要列独立(即c1有一个单词而c2有另一个单词但是哪个列有哪个单词无关紧要)那么

(CONTAINS(c1,'1') AND CONTAINS(c2,'2')) 
OR (CONTAINS(c1,'2') AND CONTAINS(c2,'1'))