2017-04-04 104 views
0

存在一個保存長代碼字符串的表。我確實需要在字符串中的多個括號之間選擇只有短代碼。在SQL Server 2014中的多個括號之間選擇值

我用的是這樣的:

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

它只返回第一個括號中的數值,但我做到這一點需要循環,並從所有的字符串中的括號內的返回碼。

任何想法如何做到這一點?

enter image description here

+0

什麼是分裂的格局? –

+0

非常類似的問題在這裏:http://stackoverflow.com/questions/42509024/get-string-between-2-characters-that-repeats-several-times-in-sql-server/42509706#42​​509706 –

回答

1

你需要的數字相符表。 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; 

如果你在一個單行需要串聯

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

完美的作品!謝謝 – attention

+1

@attention您可以通過upvoting向他人致謝,並將他們的答案標記爲有用。 –

+0

@serg爲什麼需要'sys.all_objects a,sys.all_objects b'?我們不能只用一張桌子嗎? –

0

你可以試試

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

也適用。謝謝! – attention