2013-01-31 52 views
2

0-9之間的所有數字我使用的子功能的情況下statment返回「B0」之間的所有號碼 - 「B9」TSQL:串包括除5

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-9]' 

,但我不希望返回列表中的數字'B5'。我可以得到它的工作,因爲這

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-4]' 
WHEN SUBSTRING (postcode, 1, 2) like 'B[6-9]' 

但有沒有辦法將此添加到一行如下?

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-9]' and not like 'B5' 

編輯:

你會如何,如果你做到這一點,其中用0-100之間的數字打交道,因此SQL會像

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]' 

,但你不希望包括16和17?

+2

不需要'LIKE'我的話,你可以用這個。 '...和郵政編碼<>'B5'' –

回答

7
WHEN SUBSTRING (postcode, 1, 2) like 'B[]' -- No "5" 

LIKE模式很棒。迷你正則表達式,如果你願意。

要將此數字帶到數十位或更多位置,您可能需要考慮將這些值放入一個表格中,您可以將它們用於join,existsin

或者,由於我們將該列的數字部分看作是數字而不是字符串,這表示它們可能更好地存儲爲兩列:一個用於alpha,一個用於數字。

除非任何改變你的模式,你可能會刪除字母字符特設所以你可以把它們比作一個數字範圍,例如:

where cast(replace(postcode, 'B', '') as int) between 0 and 15 
    or cast(replace(postcode, 'B', '') as int) between 18 and 100 

where cast(right(postcode, len(postcode) - 1) as int) between 0 and 15 
    or cast(right(postcode, len(postcode) - 1) as int) between 18 and 100 

這些只是一對夫婦的可能性。你會最清楚如何按摩你的數據。

+0

只是出於好奇,你會怎麼做,如果你在哪裏處理數字在0-100之間,所以SQL會像......當SUBSTRING(郵編,1,3 )像'B [0-9] [0-9]'...但你不想包括16和17? –

+2

在這一點上,我想在一個表中使用這些值,我可以使用它作爲join/exists/in。您也可以使用多個條件作爲其他答案和評論提及。我會添加一個例子。 –

3

你可以試試有兩個範圍,從中取出5:

WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]' 
+0

我不確定,但從這裏的描述LIKS這裏http://msdn.microsoft.com/en-us/library/ms179859.aspx沒有指出多個範圍不起作用 – koopajah

+1

多個範圍的工作。 –

+0

@TimLehner:謝謝您的確認 – koopajah

1

使用^表示不..看到Like ...

,但爲什麼不嘗試

`WHEN SUBSTRING (postcode, 1, 2) like 'B[0-4]' Or 
     SUBSTRING (postcode, 1, 2) like 'B[6-9]'` 

或者你可以把範圍放在同一個括號內

`WHEN SUBSTRING (postcode, 1, 2) like 'B[0-46-9]' 
0

對於單個數字的情況下(你原來的問題),你已經得到了一堆很好的答案。但是,如果沒有真正的正則表達式,則無法解決多位數問題。

它接近你想要排除的值列表。如果 「excludables」 的列表是表使用NOT EXISTS代替

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]' 
AND SUBSTRING (postcode, 1, 3) NOT IN ('B16', 'B17') 

WHEN SUBSTRING (postcode, 1, 3) like 'B[0-9][0-9]' 
AND NOT EXISTS(SELECT 1 FROM dbo.excludables AS ex WHERE ex.val = SUBSTRING (postcode, 1, 3))