2013-06-18 121 views
0

我使用MS SQL 2008和我有一個來自這樣一個狀態字段:如何過濾SQL查詢購買完全匹配字符串?

"REF CNF PCNF REL" 

我需要得到所有狀態CNF的訂單,而無需返回PCNF。 我可以在WHERE STATUS LIKE '% CNF %'之前和之後使用空格,但如果CNF是第一個或最後一個狀態,它將起作用。該工作

一個解決辦法是:

WHERE 
    PATINDEX('CNF %',STATUS)=0 AND 
    PATINDEX('% CNF %',STATUS)=0 AND 
    PATINDEX('% CNF',STATUS)=0 

但是,這僅僅是可怕的。 謝謝,

+2

你應該將狀態字段標準化到它自己的表中,然後這個問題基本消失。當您需要定期處理該字段的「子數據」時,請勿將格式化的數據和/或多個數據存儲在單個字段中。 –

回答

2

正如Marc B.所說,你應該規範化你的表,以避免在一個字段中存儲多個值。

如果沒有憑據要做到這一點,或者如果你想保持你的模型,因爲它,你可以試試你的字符串前後添加空格:

WHERE ' '+STATUS+' ' LIKE '% CNF %' 

這樣你不必擔心CNF是您列表中的第一項或最後一項。

我不知道它是最優雅/有效的解決方案,但它的工作原理。

+0

這不涉及在評估where子句之前對結果集中的每一行執行串聯嗎?這可能會在一張大桌子上變得昂貴。 –

+0

當然,但不能超過3例'PATINDEX'調用。尋找字符串模式('LIKE')已經非常昂貴。爲了有效,標準化+索引是關鍵。 –

0

爲什麼不乾脆

WHERE STATUS LIKE '% CNF%' OR STATUS LIKE 'CNF%' 

通配符%匹配任何字符,也沒有。

+0

如果CNF出現在第一位?結果幾乎和OP的解決方案一樣長。那麼如果有'CNFF'呢? –

+0

第一名?是不是......或狀態像'CNF%''? – Mackie

+1

是的,我同意,但'CNFF'仍然出來(我假設這個csae可能在未來發生,如果不是現在,因爲OP在他/她尋找的價值前後使用空格作爲分隔符)。另外,這並不比OP的解決方案短。 –

0

使用SQL 2008's own internal functions,我能想到的最好的是他得到了下來,只留下兩個象條件:

where STATUS like 'CNF%' or STATUS like '%[^P]CNF%' 

但是,如果你願意install a .Net add-on,你可以使用正則表達式,像這樣:

where 1 = dbo.RegExpLike(STATUS, '(CNF| CNF)')