在SQL Server 2014中选择多个括号之间的值

时间:2017-04-04 10:02:30

标签: sql sql-server

有一个包含长代码字符串的表。我确实只需要在字符串中的多个括号中选择短代码。

我正在使用它:

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

它只返回第一个括号中的值,但我确实需要它来循环并返回字符串中所有括号的代码。

任何想法如何做到这一点?

enter image description here

2 个答案:

答案 0 :(得分:1)

你需要统计数字表。演示

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;

答案 1 :(得分: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)