2012-06-14 36 views
5

Sql sunucusunda bunu yapmak zorunda

Böyle

Bunun eşleşmeleri olarak iki harfli kelimeyi seçmek gerekir
Belo Horizonte , MG - Brazil 
São Paulo , SP - Brazil 
Barueri , SP - Brazil 
Ferraz de Vasconcelos , SP - Brazil 

olarak veri var

Space Letter Letter 

desen bu

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

Ama bu (yani) çıkış Ferraz de Vasconcelos , SP - Brazil

Temizle görünüm problemi

örneğin son satırında bulunan olarak

MG SP SP SP 

Ve de dahil olmak zorunda tek harfler dikkate almak gerekir

Örn: Vaişnava st northwind GH - Sonuç olmak zorunda GH

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

üzgün neden .. sütun –

+1

kullanıyor ne harmanlama sırası? – JAQFrost

+0

harmanlama genereic kullanıyoruz - Onun büyük/küçük harfe duyarlı değil (İngilizce) –

cevap

0

S seçecek virgülden sonra 2 leters:

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

veya - kullanarak:

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

Final, zarif değil, çözüm:

İki büyük harf seçer
SUBSTRING(ADDRESS_BLOCK,PatIndex('% [ABCDEFGHIJKLMOPQWXYZ][ABCDEFGHIJKLMOPQWXYZ] %',ADDRESS_BLOCK),3) 

.

+0

Bir örnek verdim ama tüm değerler sahip olmayacak, –

+0

@ ArunKumar '-' sonrası sözcükleri var mı? –

+0

Yanıtlarınız için teşekkürler, ancak tüm verilerim için değil bcoz bazen son kelimeye sahip olmayabilir (-brezilya) ve bazen contan olmayacaktır, ayrıca –

-1

Harmanlama önemlidir. - Geçerli bir açıkça duyarsız olduğu

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; 

Bir fark harmanlamayı gerekebilir: Aşağıdaki gibi sorgunuza Collate eklemeniz gerekir. Geçerli harmanlama durumunuzu bulabilir ve mevcut harmanlama işleminizin geçerli sürüm halini almak için 'u CS ile değiştirerek Latin1_General_CS_AS_KS_WS'u değiştirin.

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

+0

Aşağı çekmek yerine, bir yorum yararlı olacaktır. Beni neyin yanlış olduğu konusunda aydınlatmak isteyen var mı? –

0

sadece bu deneyebilir misiniz:

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

Example

+0

Bu, bu durumda çalışmaz Av. Brik. Faria Lima, 1355 4º andar São Paulo, SP 01452-002 Brezilya –

+0

İki karakterden önce daima bir [COMMA] 've' [SPACE] 'olacak mı? Kullanıcı girdisinden mi yoksa değerleri mi üretiyorsunuz? – bendataclear

+0

Dava 1) Her zaman iki charaters arasında bir boşluk var, ancak virgül içerebileceği veya içermeyebileceği için virgül alınamıyor. –

3

bu deneyin: Her iki sütun harmanlamak VE harf belirtmek Sen gerekiyor. Bir harmanlama dizisi belirtseniz bile, normal ifade [A-Z] büyük/küçük harfe duyarlı değildir.

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

Sanırım bunu yapacak ... ya da gereksinimlerinize uygun bir varyasyon. . Bu durumda, ilk büyük harf çiftini seçer ...

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 rahatsızlıktan dolayı

+0

Whoops David Beat Me to It. :) –

İlgili konular