2013-06-05 61 views
3
SELECT..... 

(v1.PCG like 'n0%' 
or 
v1.PCG like 'n1%' 
or 
v1.PCG like 'n2%' 
or 
v1.PCG like 'n3%' 
or 
v1.PCG like 'n4%' 
or 
v1.PCG like 'n5%' 
or v1.PCG='N63Af1') 

and v1.PCG not like 'N2D%' 
and v1.PCG not like 'N2E%' 
and v1.PCG not like 'N2C%' 
and v1.PCG not like 'N2F%' 
and v1.PCG not like 'N2J%' 
and v1.PCG not like 'N2K%' 
and v1.PCG not like 'N2U%' 
and v1.PCG not like 'N2GC%' 
and v1.PCG not like 'N2GD%' 
and v1.PCG not like 'N2GH%' 
and v1.PCG not like 'N2GJ%' 
and v1.PCG not like 'N2GK%' 
) as 'Value Of PN Orders', 

from........ 

我已經競爭我的代碼,但我試圖找到一個更有效的方式做到這一點,我看了一下,但無法找到另一種方式......任何建議?試圖尋找替代喜歡而不喜歡(SQL)

+0

一個正則表達式可以使這個更加緊湊,但它不是SQL Server本機。您需要通過[CLR程序集](http://stackoverflow.com/a/13439423/1324345) – alroc

回答

4

工作Like支持字符類等等;

where v1.PCG like 'n[12345]%' 
+0

有關語法的更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/ms179859%28v=sql.90%29.aspx –

+0

@AlexK。 。 。 。這隻解決了where子句的一部分。您應該擴展整個條款的答案。 –

0

這看起來像regular expressions

+0

-1來完成。請不要只給出只有答案的答案。鏈接斷裂,答案變得毫無用處。此外,這並沒有回答這個問題。它只會重定向到其他人。 –

0

您可以在T-SQL查詢中的WHERE語句中使用CONTAINS()謂詞。

SELECT <<COLUMNS>> 
FROM <<TABLE>> 
WHERE CONTAINS(<<COLUMN TO SEARCH>>, <<VALUE TO SEARCH>>); 

閱讀資料在這裏: MSDN : CONTAINS (T-SQL)

2

這種特殊情況下,可以使用通配符的工作 - 不是真的需要正則表達式:

(v1.PCG LIKE 'n[0-5]%' OR v1.PCG='N63Af1') 
AND v1.PCG NOT LIKE 'N2[CDEFJKU]%' 
AND v1.PCG NOT LIKE 'N2G[CDHJK]%' 

是不會改變的語義太多的替代,但會讀取更清潔,將使用表變量或CTE來加入:

DECLARE @match TABLE (Value varchar(5)) 
INSERT @match VALUES 
    ('N0%'), 
    ('N1%'), 
    ('N2%'), 
    ('N3%'), 
    ('N4%'), 
    ('N5%'), 
    ('N63Af1') 

DECLARE @not TABLE (Value varchar(5)) 
INSERT @not VALUES 
    ('N2D%'), 
    ('N2E%'), 
    ('N2C%'), 
    ('N2F%'), 
    ('N2J%'), 
    ('N2K%'), 
    ('N2U%'), 
    ('N2GC%'), 
    ('N2GD%'), 
    ('N2GH%'), 
    ('N2GJ%'), 
    ('N2GK%') 

SELECT ... 
JOIN @match ON 
    v1.PCG LIKE @match.Value 
LEFT OUTER JOIN @not ON 
    v1.PCG NOT LIKE @not.Value 
WHERE 
    @not.Value IS NULL 

如果您的值是用戶提供的,那麼這是個好方法。不過,在這種情況下,我認爲通配符贏得了易用性。