2012-11-01 22 views
2

我有一個SQL查詢連接幾個表,我想篩選記錄使用相同的LIKE條件許多列的結果集。 例如,我在我的查詢(t1,t2和t3是連接表名稱)列中有t1.Name,t1.FullName,t1.Comment,t2.Name,t3.Description等字段,我想檢查t1。名稱或t1.FullName或t1.Comment或t2.Name或t3.Description是LIKE'%sometext%'。 我只是感興趣什麼SQL會更快?相同的LIKE條件適用於許多列

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,並且當連接可能包含模式,但字段單獨不。

+0

你有沒有在SSMS中運行這個估計的執行計劃? – rcdmk

+1

can t1.name會包含'some'和t1.fullname'text'? – podiluska

+0

如果一列結束'一些',而下一列開始'文本',則連接選項可能返回OR條件不匹配的匹配項。那是問題嗎? –

回答

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. t1.FullName + ....可能會導致空 - 你必須處理這個
  3. t1.FullName + ....可能導致文本被人發現t1.Comment和t2.Name之間,例如
    • t1.Comment歡迎轂
    • t2.Name =布萊尼姆
    • sometext ='哈勃
    • .. t1.Comment + t2.Name ... = ... 哈勃 nheim matches哈勃
1

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

例如,使用WHERE t1.FullName LIKE '%sometext%'停止服務器使用該列上的索引。

+0

謝謝。但是關於連接表的查詢呢?我可以爲不同表格的列創建全文索引嗎? – mao

0

我認爲,第二種方式是更好的:

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

但是這兩個查詢的優點和缺點;如果這些字段包含非常大(長)的數據,則查詢#1可以更快地工作。

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. 
1

這取決於大小和列數以及搜索字符串的頻率。可能還有其他的東西。

請注意,這兩個查詢將而不是產生相同的結果。凝聚查詢不像第一個那樣處理NULL值。

想象一下以'%some'結尾的名字和以'text%'開頭的描述。

相關問題