3

我有一个连接几个表的 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 并且连接可能包含模式但单独的字段不包含的情况。

4

5 回答 5

1

它取决于列的大小和数量以及搜索字符串的频率。可能还有其他事情。

请注意,这两个查询不会产生相同的结果。连接查询处理 NULL 值的方式与第一个查询不同。

想象一下以“%some”结尾的名称和以“text%”开头的描述。

于 2012-11-01T11:36:16.687 回答
1

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

usingWHERE t1.FullName LIKE '%sometext%'例如,停止服务器在该列上使用索引。

于 2012-11-01T11:18:21.733 回答
1

我会这样写:

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

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

  1. 字符串摘要统计信息可用于为查询提供服务,并且在特殊情况下它可以组合不同列上的不同索引。这对于连接的文本是不可能的
  2. t1.FullName + ....可能导致 NULL - 你必须处理这个
  3. t1.FullName + ....可能会导致在 t1.Comment 和 t2.Name 之间找到 Text,例如
    • t1.Comment 欢迎来到集线器
    • t2.Name = 布伦海姆
    • sometext = '哈勃'
    • .. t1.Comment + t2.Name ... = ... hubBle nheim matches hubble
于 2012-11-01T11:26:46.017 回答
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.
于 2012-11-01T11:31:32.343 回答
0

我认为第二种方法更好:

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

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

于 2012-11-01T11:20:44.597 回答