2013-03-18 61 views
2

我正在使用一個存儲過程,它引入一個字符串參數,並將其用作其查詢之一的WHERE table.value LIKE @pattern子句的一部分。在任何人跳過我的喉嚨關於這種調用的危險之前,該過程被稱爲具有一組已知值中的一個作爲模式參數 - 沒有從用戶輸入到該參數的直接傳遞。匹配SQL Server LIKE中的複雜模式?

對於個別情況,這是有效的。我可能的模式是:

"RBI-%-TH%N-[AB]-%" 
"RBI-%-TH%N-C-%" 
"RBI-%-TH%N-D-%" 
"RBI-%-VISUAL%" 

當我遇到的一個問題是在試圖通過設置默認模式(這將選擇其中table.value匹配任何這些模式的所有記錄,以覆蓋那些所有四個,但沒有別的)。前三個很容易與"RBI-%-TH%N-[ABCD]-%"但我一直沒能找到一個好的方法來說明最終的可能值。有沒有一種好的方法,還是我需要用邏輯來處理這種情況使存儲過程複雜化?

回答

0

select ... from ... 
where [value] like "RBI-%-TH%N-[ABCD]-%" or [value] like "RBI-%-VISUAL%" 

不夠?

+0

如果我必須走那條路,我會的。我希望能夠用一種模式來覆蓋這兩種情況。還有更多的東西進入到這個過程中,如果我只傳入一個模式參數,它會讓事情變得更簡單。 – 2013-03-18 23:08:42

0

這是另一種使用UNION ALL的變體,根據基數可能會導致更有限的範圍掃描,但無論您如何構建查詢,您都有可能進行一些長時間運行的掃描。您必須測試一些變體並查看執行計劃,以查看在數據運行時性能如何疊加。設置和使用免費文本搜索選項?

SELECT ... 
FROM ... 
WHERE [value] like "RBI-%-TH%N-[A]-%" 
UNION ALL 
SELECT ... 
FROM ... 
WHERE [value] like "RBI-%-TH%N-[B]-%" 
UNION ALL 
SELECT ... 
FROM ... 
WHERE [value] like "RBI-%-TH%N-[C]-%" 
UNION ALL 
SELECT ... 
FROM ... 
WHERE [value] like "RBI-%-TH%N-[D]-%" 
UNION ALL 
SELECT ... 
FROM ... 
WHERE [value] like "RBI-%-VISUAL%"; 
0

我問過類似的問題在:

TSQL - Pattern Matching with Like

並有一些很好的答案。我認爲最能幫助你的是將你的可能模式放到一個新表中,然後按照MaxiWheat的建議加入表格。