有一个包含长代码字符串的表。我确实只需要在字符串中的多个括号中选择短代码。
我正在使用它:
SELECT
Code,
SUBSTRING(Code,CHARINDEX('(',Code)+1,(CHARINDEX(')',Code)-CHARINDEX('(',Code))-1) AS CodeSplit
FROM
#temp1
它只返回第一个括号中的值,但我确实需要它来循环并返回字符串中所有括号的代码。
任何想法如何做到这一点?
答案 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)