包含LIKE的NULLable列的WHERE子句保持索引使用

时间:2014-02-14 07:17:32

标签: sql-server null indexing sql-like

对于列ColA为VARCHAR(x)的表,我该如何重写这个条件

ColA LIKE @param + '%'

考虑到:

  • 1 / ColA是NULLable。
  • 2 / @param可能为NULL
  • 3 / ColA上有一个索引,它应该用于所有搜索
  • 4 /避免sp_executesql,因为这是更大的存储过程的一部分

我在想:

ISNULL(ColA, '') LIKE (CASE WHEN @param IS NULL THEN '%' ELSE @param + '%' END)         

但这不会使用ColA上定义的索引。

2 个答案:

答案 0 :(得分:1)

分为两个条件:

...
WHERE ((@param is null AND ColA is null)
  OR (@param IS NOT NULL AND ColA LIKE @param + '%'))

但是OR经常会杀死索引使用,所以如果这不起作用,请尝试进一步分为两个查询:

...
WHERE @param is null
AND ColA is null
UNION
...
WHERE @param IS NOT NULL
AND ColA LIKE @param + '%'

但是

答案 1 :(得分:0)

只需使用:

WHERE ((@param is NULL) and (ColA is NULL)) OR (ColA LIKE '%' + @param + '%')

但是如果使用LIKE '%' + @param + '%'索引则不能使用(如果它不是FULL-TEXT索引):

- SQL Server Index - Any improvement for LIKE queries?

- Index usage by %Like% operator – Query Tuning