【问题标题】:Parameterizing an SQL query which uses the NOT LIKE, " ^ " wildcard?参数化使用 NOT LIKE、“^”通配符的 SQL 查询?
【发布时间】:2012-10-25 21:32:00
【问题描述】:

如何参数化以下查询? (顺便说一下,我使用的是全文索引表,因此是 CONTAINS()

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 语句的参数化版本,它返回带有'cat dog'和'cat'而不是'cat dog bird'的行)

**这是我的数据的一个非常简化的版本,但问题是与我试图实现的概念完全匹配。该表将有数百万行,每行中有许多术语。

【问题讨论】:

  • 你只有两个任期吗?因为只有 4 种不同的组合“狗”、“猫”、“狗猫”、“猫狗”,所以您可以创建 4 种组合并进行精确匹配搜索。
  • 不,这是在具有数百万行的全文搜索巨大表中。我想要包含语句中仅术语的完全匹配(/除这些术语之外的任何行)。每次进行搜索时,参数都会有所不同(因此我没有停在CONTAINS()
  • 可以,但您可以先使用 contains,然后再使用 AND 组合。我刚刚发布了一个可能有用的答案。

标签: sql-server-2008 wildcard sql-like


【解决方案1】:

你应该这样做

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

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

或者,您可以初始化 @term4 以包括 % 符号:

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

然后将LIKE 语句简化为:

column NOT LIKE @term4

【讨论】:

  • 我很高兴它有效。您需要小心:在 T-SQL 中,'@term1' 代表该字符串的字面意义,而不是 @term1 变量的值
  • 你知道,我实际上以为我是在用括号“逃避”它。括号和参数肯定有一个灰色区域。我是“^”通配符和转义括号的新手——非常有用。不敢相信我以前不知道。
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多