2012-10-25 59 views
1

如何参数化以下查询? (顺便说一下我使用的全文索引表,因此CONTAINS()参数化使用NOT LIKE,“^”通配符的SQL查询?

SELECT * FROM Table WHERE CONTAINS(Column, 'cat OR dog') 
and ((column NOT LIKE '%[^ cat OR dog]%')); 

这不起作用:

DECLARE @term1 VARCHAR(10); 

DECLARE @term2 VARCHAR(10); 

SET @term1 = 'cat'; 

SET @term2 = 'dog'; 

SET @term3 = @term1 + ' ' + 'OR' + ' ' + @term2; 

SET @term4 = '[^ @term1 OR @term2 ]' ; 

SELECT * FROM table WHERE CONTAINS(column, @term3) <--up to this point works 
AND (column NOT LIKE '%[@term4]%'); <--this part doesn't include the second term (@term2) 

如果你想用这个去拨弄你的结束,我的全文索引表的样子:

animalListID  AnimalsList 
     1   cat dog 
     2   cat 
     3   cat dog bird 

(基本上是我需要的SELECT声明与“狗猫”和“猫”而不是“猫狗鸟”返回行的参数版)

**这是一个非常简单的我的数据版本,但问题是我试图实现的概念完全匹配。该表格将包含数百万行,并且每行有许多条款。

+0

您是否只有两个条件?因为只有4种不同的组合,即'狗','猫','狗猫','猫狗',所以你可以创建4种组合,并且只是进行完全匹配搜索。 –

+0

不,这是一个全文搜索巨大的表格,有数百万行。我只想要包含语句中的术语的完全匹配(/不包含除这些术语以外的任何行)。每次执行搜索时参数都会有所不同(因此为什么我没有停在'CONTAINS()') – Rachael

+0

是的,但是您可以先使用contains,然后使用AND与AND组合。我刚刚发布了可能有效的答案。 –

回答

2

你应该做

SET @term4 = '[^ ' + @term1 + ' OR ' + @term2 + ' ]'; 

column NOT LIKE '%' + @term4 + '%' 

或者,您可以初始化@term4还包括%迹象:

SET @term4 = '%[^ ' + @term1 + ' OR ' + @term2 + ' ]%'; 

和然后将LIKE简化为:

column NOT LIKE @term4 
+0

啊! @ w0lf。非常感谢! – Rachael

+0

我很高兴它的工作原理。你需要小心:在T-SQL中,'@ term1'代表字面上的字符串,而不是'@ term1'变量的值 – GolfWolf

+0

你知道,我真的以为我用括号“逃避”了。括号和参数确实存在灰色区域。我是新来的“^”通配符和转义括号 - 非常有用。不敢相信我以前不知道。 – Rachael