相同的LIKE条件应用于许多列

时间:2012-11-01 11:14:51

标签: sql sql-server sql-like

我有一个连接几个表的SQL查询,我想为结果集的许多列使用相同的LIKE条件过滤记录。 例如,我的查询中有列t1.Name,t1.FullName,t1.Comment,t2.Name,t3.Description等(t1,t2和t3是连接的表名),我想检查t1.Name或t1.FullName或t1.Comment或t2.Name或t3.Description是LIKE'%sometext%'。 我只是对SQL更快会感兴趣吗?

WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'

WHERE ISNULL(t1.Name,'') + '|' + ISNULL(t1.FullName,'') + '|' + ISNULL(t1.Comment,'') + '|' + ISNULL(t2.Name,'') + '|' + ISNULL(t3.Description,'') LIKE '%sometext%'

或者可能有一些更快的方式? 我正在使用MS SQL Server 2008 R2。

UPD:我编辑了第二个查询来处理某些字段为NULL并且连接可能包含模式但字段不包含的情况。

5 个答案:

答案 0 :(得分:1)

最好的方法是使用 FULL-TEXT SEARCH

例如,使用WHERE t1.FullName LIKE '%sometext%'

阻止服务器在该列上使用索引。

答案 1 :(得分:1)

我会这样写:

WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'

不使用后者的几个原因,更快甚至没有发挥作用:

  1. String summary statistics可用于为查询提供服务,并且在特殊情况下它可以在不同列上组合不同的索引。使用连接文本
  2. 是不可能的
  3. t1.FullName + ....可能会导致NULL - 您必须处理此
  4. t1.FullName + ....可能导致在t1.Comment和t2.Name之间找到Text,例如
    • t1.Comment欢迎来到中心
    • t2.Name = Blenheim
    • sometext ='hubble'
    • .. t1.Comment + t2.Name ... = ... hubBle nheim matches hubble

答案 2 :(得分:1)

取决于列的大小和数量以及搜索字符串的频率。还有其他的东西。

请注意,两个查询会产生相同的结果。 concatinating查询不像第一个那样处理NULL值。

想象一下,名称以'%some'结尾,描述以'text%'开头。

答案 3 :(得分:0)

我认为第二种方式更好:

WHERE t1.Name + t1.FullName + t1.Comment + t2.Name + t3.Description LIKE '%sometext%'

然而,这两个问题都有优点和缺点;如果这些字段包含非常大(长)的数据,则查询#1可以更快地工作。

答案 4 :(得分:0)

"WHERE t1.FullName LIKE '%sometext%' OR t1.Comment LIKE '%sometext%' OR
      t2.Name LIKE '%sometext%' OR t3.Description  LIKE '%sometext%'"
or

"WHERE t1.Name + t1.FullName + t1.Comment + t2.Name + t3.Description LIKE '%sometext%'"

=============
Here Both are take same time bacause each condition is checked by separatly one by one.
No way to differnce in both condition.