2013-07-31 23 views
8

Aşağıdaki gibi dizeleri içeren bir sütunlu bir tablo var.değişken uzunluğunun alt dizesi

RTSPP_LZ_AEN 
RTSPP_LZ_CPS 
RTSPP_LZ_HOUSTON 
RTSPP_LZ_LCRA 
RTSPP_LZ_NORTH 
RTSPP_LZ_RAYBN 
RTSPP_LZ_SOUTH 
RTSPP_LZ_WEST 
RTSPP_BTE_CC1 
RTSPP_BTE_PUN1 
RTSPP_BTE_PUN2 

ipi sonuna kadar _ ikinci olay gelen alt dizeyi almak gerekir ve gördüğünüz gibi alt dize sabit uzunlukta değildir. İlk kısım her zaman değişmez, değişebilir. Şu an için bunu başarmak için aşağıdaki kodu kullanıyorum.

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,100) 
FROM [Table] 

Gördüğünüz gibi, değişken uzunlukla ilgilenecek uzunluk olarak keyfi büyük bir değer alıyorum. Bunu yapmanın daha iyi bir yolu var mı?

+0

Her zaman tam olarak 2 alt çizgi olacak mı? –

+0

İlk kısım daima RTSPP_LZ_ ya da başka değerlere sahip olabilir mi? –

+0

@AaronBertrand Şu an itibariyle 2'den fazla altçizgi olan bir vaka ile karşılaşmadım. Gelecekte böyle bir durumda dizenin sonuna kadar son alt çizgi ortaya çıkabilir. çizgi ninci oluşumu olacaktır işleyebilir bir daha genel bir çözüm büyük ölçüde len söz için bunlar RTSPP_BTE_CC1 gibi RTSPP_BTE_PUN1 RTSPP_BTE_PUN2 – Ram

cevap

11

Geçen bulmak için REVERSE fonksiyonuyla birlikte CHARINDEX kullanabilirsiniz _ oluşumu ve dizenin sonuna belirtilen sayıda karakter almak için RIGHT kullanabilirsiniz.

SELECT RIGHT([String],CHARINDEX('_',REVERSE([String]),0)-1) 

SQLFiddle DEMO

+0

Basit çözüm ve demo için teşekkürler – Ram

6

yapabilirsiniz son argüman olarak len ([dize]) vererek deneyin:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table] 
+0

+ 1 sayesinde değiştirebilir – Ram

0

Veya bu bile:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1, 
      LEN([String])-CHARINDEX('_',[String])+1) 
1

Aşağıdaki kodu gibi işi yapmak için ortak bir tablo ifade kullanabilirsiniz. Dizede kaç alt çizgi olursa olsun tüm alt dizeleri elde etmek için ek esneklik sağlar.

;WITH cte AS (
    SELECT 
     0 AS row 
     ,CHARINDEX('_', [String]) pos 
     ,[String] 
    FROM [Table] 
    UNION ALL 
    SELECT 
     row + 1 
     ,CHARINDEX('_', [String], pos + 1) 
     ,[String] 
    FROM cte 
    WHERE pos > 0 
) 
SELECT 
    row 
    ,[String] 
    ,pos 
    ,SUBSTRING([String], pos + 1, LEN([String]) -pos) 
FROM cte 
WHERE pos > 0 
-- Remove line below to see all possible substrs 
    AND row = 1 
ORDER BY 
    [String], pos 
+0

+1 Cevabınız için teşekkürler ve sıfır alt çizgi olduğunda durumu işler ancak CTE kullanamıyorum çünkü bu daha büyük bir sorgunun küçük bir parçası. – Ram