2011-09-23 55 views
1

我寫的一些疑問是這樣的:是否有另一種寫作LIKE查詢的風格?

SELECT * 
FROM Sample.dbo.Temp 
WHERE 
    Name LIKE '%ab%' 
OR Name LIKE '%fg%' 
OR NAME LIKE '%asd%' 
OR ... 
OR ... 
OR Name LIKE '%kj%' 

反正我也可以重寫此查詢是這樣的:

SELECT * 
FROM Sample.dbo.Temp 
WHERE 
    Name LIKE (
      '%ab%' 
      OR '%fg%' 
      OR '%asd%' 
      OR ... 
      OR ... 
      OR '%kj%' 
      ) 

只是無論從管理和可讀性點看起來更舒服。如果Name列發生變化,我總是可以進行一次更改而不是一百次(或使用Find and Replace)。有什麼建議麼?

+1

No.順便說一句:LIKE搜索標準和通配符的前綴減少了任何可用索引的有用性。 –

回答

2

不行,你必須保持重複LIKE

雖然你很可能有點繞愚弄,使其工作類似的東西,它不會是漂亮或更易讀。

也許你應該以編程方式生成查詢,而不是手動編寫此?

PS:也許全文索引是一個更好的主意嗎?

+0

太棒了!感謝您的建議。將接受這個作爲時限後的答案。 – Legend

+0

@Legend:請注意,使用'LIKE'%...''查詢(即以'%'開頭)不能使用索引,所以這將是一個緩慢的查詢,你應該考慮使用全文搜索:) – Wolph

+0

是。當然。已經添加了全文索引:) – Legend

2

您可以將這些值放在一個表格中,或許是CTE,然後在表格中插入semijoin,例如

WITH params 
    AS 
    (
     SELECT * 
     FROM (
       VALUES ('at'), 
        ('fg'), 
        ('asd'), 
        ('kj') 
      ) AS T (param) 
    ) 
SELECT * 
    FROM Sample.dbo.Temp T 
WHERE EXISTS (
       SELECT * 
       FROM params P 
       WHERE T.Name LIKE '%' + P.param + '%' 
      ); 

,看起來長篇大論,但如果CTE是不是基表他們的查詢可以數據驅動的,即如果參數值列表需要在將來改變那就僅僅包含更新表,而比修改硬編碼值(可能在多個對象中)。

+0

+ 1.我喜歡這個解決方案,如果你在參數中包含%,而不是爲每個連接添加它,我認爲你可以獲得更好的性能。 –

+0

@ t-clausen.dk:這聽起來合乎邏輯,很有希望,但需要測試。 – onedaywhen

相關問題