2013-07-31 18 views
8

Mam tabelę z kolumną zawierającą ciągi jak poniżej.podciąg o zmiennej długości

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 

muszę uzyskać podciąg z drugiego wystąpienia _ do końca sznurka i jak widać podciąg nie ma stałej długości. Pierwsza część nie zawsze jest naprawiona, może się zmienić. Obecnie używam następującego kodu, aby to osiągnąć.

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

Jak widzę biorę arbitralnie dużą wartość jako długość, aby zająć się zmienną długością. Czy jest lepszy sposób na zrobienie tego?

+0

Czy zawsze będą dokładnie 2 podkreślenia? –

+0

Czy pierwsza część zawsze RTSPP_LZ_ lub może mieć inne wartości? –

+0

@AaronBertrand Odtąd nie spotkałem się z przypadkiem z więcej niż 2 podkreśleniami. Może się zdarzyć w przyszłości w takim przypadku w ostatnim podkreśleniu do końca łańcucha. Bardziej ogólne rozwiązanie, które może obsłużyć n-tego wystąpienia podkreślenia byłoby bardzo mile widziane – Ram

Odpowiedz

11

Można wykorzystać CHARINDEX w połączeniu z REVERSE funkcji znaleźć ostatni Wystąpienie _, a można użyć RIGHT, aby uzyskać określoną liczbę znaków od końca łańcucha.

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

SQLFiddle DEMO

+0

Dziękuję za proste rozwiązanie i demo – Ram

6

można spróbować dając DŁ ([łańcuch]) jako ostatni argument:

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

+1 dzięki za wspomnienie len ([łańcuch]). Całkowicie o tym zapomniałem. – Ram

0

Lub nawet ta:

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

Można użyć wspólnej wyrażenie tabeli, aby wykonać zadanie jak poniższy kod. Daje dodatkową elastyczność, aby uzyskać wszystkie podciągi bez względu na liczbę podkreśleń w łańcuchu.

;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 Dziękuję za odpowiedź, która obsługuje nawet przypadek, gdy są zero podkreśleń, ale nie mogę użyć CTE, ponieważ jest to niewielka część znacznie większego zapytania – Ram

Powiązane problemy