2014-02-14 32 views
2

對於一列可樂爲VARCHAR(x)的一個表,我應該怎麼改寫這個條件凡在空列,方含LIKE子句,保持索引的使用

ColA LIKE @param + '%' 

考慮到:

  • 1/ColA無效。
  • 2/@參數可以是NULL
  • 3 /上有可樂的指標,它應該被用於所有的搜索
  • 4 /避免sp_executesql的,因爲這是大得多的存儲過程的一部分

那時我在想:

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

,但這將不會使用在可樂定義的索引。

+1

如果@參數爲空,應行,其中可樂空是回?也就是說應該將空值視爲「相等」? – Bohemian

+0

@Bohemian:是的,NULL應該被認爲是「相等的」 – user3104183

+2

「ColA有一個索引,它應該用於所有搜索」 - 好吧,它不會。具有前導通配符的LIKE條件可以不使用索引。 –

回答

0

只需使用:

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

但是如果你使用LIKE '%' + @param + '%'指數不能使用(如果它不是全文索引):

- SQL Server Index - Any improvement for LIKE queries?

- Index usage by %Like% operator – Query Tuning

+0

如果ColA爲NULL,它將不會返回任何行... – user3104183

+0

僅當@param爲NULL時纔會返回ColA = NULL。 – valex

+0

不,它不會在param爲空時返回每一行 – Bohemian

1

分成兩個條件:

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

但或者經常殺死索引的使用,因此,如果還是不行,請嘗試進一步分裂成兩個查詢:

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

+0

我認爲第二個條件'@param IS NOT NULL'是不必要的。在'@ param = NULL'的情況下,我們得到'ColA LIKE NULL',它總是FALSE。 – valex

+0

@valex *邏輯上*它可能是不必要的,但*性能*可能會更大,因爲當param爲null時可以避免整個LIKE搜索。通過額外的測試,它可能會執行類似於(取決於優化程序) – Bohemian

+0

我同意這取決於優化程序。 – valex