2012-06-14 50 views
5

我不得不這樣做在SQL Server如何通過SQL Server查詢發現Word只大寫字母

我如

Belo Horizonte , MG - Brazil 
São Paulo , SP - Brazil 
Barueri , SP - Brazil 
Ferraz de Vasconcelos , SP - Brazil 

,我需要選擇兩個字母的單詞作爲匹配數據圖案

Space Letter Letter 

我已經試過這

SUBSTRING(ADDRESS_BLOCK,PatIndex('% [A-Z][A-Z] %',ADDRESS_BLOCK),3) 

但我需要考慮的只有大寫字母這個(IE)的輸出必須是

MG SP SP SP 

而且不包括de如示例中的最後一行發現了問題

Ferraz de Vasconcelos , SP - Brazil

明確的說法

如:毗溼奴ST羅斯文GH - 結果必須是GH

somersert PM vailash hj --Result has to be PM 
+0

抱歉造成的不便.. –

+1

什麼歸類序列列使用? – JAQFrost

+0

整理我們使用genereic-它不區分大小寫(英語) –

回答

0

小號選2個leters逗號後:

select substring(columnname, charindex(',', columnname) + 2, 2) 
from tablename 

或使用-

select substring(columnname, charindex('-', columnname) - 3, 2) 
from tablename 

最後,不優雅,溶液:

SUBSTRING(ADDRESS_BLOCK,PatIndex('% [ABCDEFGHIJKLMOPQWXYZ][ABCDEFGHIJKLMOPQWXYZ] %',ADDRESS_BLOCK),3) 

它選擇兩個大寫字母。

+0

我舉了一個例子,但所有的值不會有, –

+0

@ArunKumar他們有'-'後綴嗎? –

+0

感謝你的答案適合這個,但不是所有我的數據bcoz有時它可能沒有最後一個詞(-brazil),有時它不會被控制,也是 –

-1

整理事宜。您需要添加Collate到您的查詢,如:

Select * from table where exists (Select SUBSTRING(ADDRESS_BLOCK,PatIndex('% [A-Z][A-Z] %',ADDRESS_BLOCK),3) from table) 
COLLATE Latin1_General_CS_AS_KS_WS ASC; 

您可能需要區別整理 - 你目前的一個顯然是不區分大小寫。你可以找到你當前的排序規則,並用你所需要的替換Latin1_General_CS_AS_KS_WS,用CS替換CI,以獲得當前排序規則的大小寫敏感版本。

參見:http://msdn.microsoft.com/en-us/library/ms184391.aspx

+0

而不是downvoting,評論將是有用的。任何人都想告訴我什麼是錯的? –

0

你能不能試試這個:

SUBSTRING([ADDRESS_BLOCK],PatIndex('%, [A-Z][A-Z] -%',[ADDRESS_BLOCK])+2,2) 

Example

+0

這不適用於這種情況Av。雙桅船。法利亞利馬,13554ºandar聖保羅,SP 01452-002巴西 –

+0

在兩個字符之前總會有'[COMMA]'和'[SPACE]'?是來自用戶輸入還是您正在生成值? – bendataclear

+0

案例是1)總是有兩個字母之間的空格,但逗號不能保證,因爲它可能或可能不包含逗號 –

3

試試這個:你需要整理兩列,並指定大寫字母。即使您指定了歸類序列,正則表達式[A-Z]也不區分大小寫。

SELECT SUBSTRING(
      ADDRESS_BLOCK 
      , PatIndex( 
       N'% [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ] %' 
       , ADDRESS_BLOCK COLLATE sql_latin1_general_cp1_cs_as 
       ) 
      , 3 
      ) 
FROM 
    (
     SELECT 'Belo Horizonte , MG - Brazil' ADDRESS_BLOCK 
     UNION 
     SELECT 'São Paulo , SP - Brazil' 
     UNION 
     SELECT 'Barueri , SP - Brazil' 
     UNION 
     SELECT 'Ferraz de Vasconcelos , SP - Brazil' 
    ) n 
0

我認爲這樣做...或其變化,以滿足您的需求。 。 在這種情況下,它會挑出第一對大寫字母......

with dataset as 
(
select 'Belo Horizonte , MG - Brazil' as val union all 
select 'São Paulo , SP - Brazil' as val union all 
select 'Ferraz de Vasconcelos , SP - Brazil' 
) 
select Substring(val ,PatIndex('%[A-Z][A-Z] %' COLLATE LATIN1_gENERAL_BIN,val),3) 
from dataset 

Aamer

+0

哎呦大衛擊敗了它。 :) –