2017-04-04 3 views
0

Es gibt eine Tabelle mit einer langen Codekette. Ich muss nur kurze Codes zwischen mehreren Klammern innerhalb der Zeichenfolge auswählen.Auswählen von Werten zwischen mehreren Klammern in SQL Server 2014

ich dies mit:

SELECT 
    Code, 
    SUBSTRING(Code,CHARINDEX('(',Code)+1,(CHARINDEX(')',Code)-CHARINDEX('(',Code))-1) AS CodeSplit 
FROM 
    #temp1 

Es nur den Wert in den ersten Klammern gibt, aber ich es Schleife brauchen und Codes von allen Klammern innerhalb des Strings zurück.

Irgendwelche Ideen, wie man das macht?

enter image description here

+0

Was ist das Muster für Split? –

+0

sehr ähnliche Frage hier: http://stackoverflow.com/questions/42509024/get-string-between-2-characters-that-repeats-several-times-in-sql-server/42509706#42509706 –

Antwort

1

Sie benötigen tally Zahlentabelle. Demo

SELECT 
    Code, 
    SUBSTRING(Code,s+1,CHARINDEX(')',Code,s)-s-1) AS CodeSplit 
FROM 
    ( -- test data 
     SELECT '(123)yui(rty)999(cvb)' Code 
    ) t 
    CROSS APPLY (
     SELECT DISTINCT CHARINDEX('(',Code, n) s 
     FROM (
     -- use any tally at hand 
     SELECT TOP(len(Code)) row_number() over(order by (select null)) n 
     FROM sys.all_objects a, sys.all_objects b 
     ) tally 
    ) strt 
WHERE s>0; 

Wenn Sie Verkettung in einer einzigen Reihe

SELECT 
    Code, 
    (SELECT 
     SUBSTRING(Code,s+1,CHARINDEX(')',Code,s) - s - 1) 
     FROM ( 
      SELECT DISTINCT CHARINDEX('(',Code, n) s 
      FROM (
      SELECT TOP(len(Code)) row_number() over(order by (select null)) n 
      FROM sys.all_objects a, sys.all_objects b 
      ) tally 
     ) strt 
     WHERE s>0 
     FOR XML PATH('')) 
FROM 
    ( -- test data 
     SELECT '(123)yui(rty)999(cvb)' Code 
    ) t; 
+0

Funktioniert perfekt! Danke – attention

+1

@achtung Sie können jemandem in stackoverflow danken, indem Sie Ihre Antwort als nützlich markieren und markieren. –

+0

@serg Warum 'sys.all_objects a, sys.all_objects b' benötigt wird? Können wir nicht dasselbe mit nur einem Tisch machen? –

0

brauchen Sie versuchen, es

DECLARE @SampleDate AS TABLE (Code varchar(max)) 

INSERT INTO @SampleDate VALUES ('[1](2) [44] (2432) fff '), ('[1](2)(33)') 

;WITH temps AS 
(
    SELECT sd.Code AS RootCode, Substring(sd.Code, CHARINDEX(')',Code) + 1, len(sd.Code) - CHARINDEX(')',Code)) AS CurrentCode, 
         SUBSTRING(Code,CHARINDEX('(',Code)+1,(CHARINDEX(')',Code)-CHARINDEX('(',Code))-1) AS CurrentCodeSplit 
    FROM @SampleDate sd 

    UNION ALL 

    SELECT t.RootCode , Substring(t.CurrentCode, CHARINDEX(')',t.CurrentCode) + 1, len(t.CurrentCode) - CHARINDEX(')',t.CurrentCode)), 
       t.CurrentCodeSplit + ', ' + SUBSTRING(t.CurrentCode,CHARINDEX('(',t.CurrentCode)+1,(CHARINDEX(')',t.CurrentCode)-CHARINDEX('(',t.CurrentCode))-1) 
    FROM temps t 
    WHERE CHARINDEX('(',t.CurrentCode) > 0 
) 
SELECT t.RootCode AS Code, max(t.CurrentCodeSplit) AS CodeSplit FROM temps t 
GROUP BY t.RootCode 
OPTION (MAXRECURSION 0) 
+0

Funktioniert auch. Vielen Dank! – attention