我想从表中的记录中提取特定的ID。例如,我有一个下表
Id stringvalue
1 test (ID 123) where another ID 2596
2 next ID145 and the condition I(ID 635,897,900)
我希望结果集如下
ID SV
1 123,2596
2 145,635,897,900
我尝试过以下查询,该查询只从字符串中提取一个ID:
Select Left(substring(string,PATINDEX('%[0-9]%',string),Len(string)),3) from Table1
答案 0 :(得分:0)
我认真不鼓励采用T-SQL方法(因为SQL并不意味着这样做),但是,工作版本如下所示 -
试试这个
DECLARE @T TABLE(ID INT IDENTITY,StringValue VARCHAR(500))
INSERT INTO @T
SELECT 'test (ID 123) where another ID 2596' UNION ALL
SELECT 'next ID145 and the condition I(ID 635,897,900)'
;WITH SplitCTE AS(
SELECT
F1.ID,
X.SplitData
,Position = PATINDEX('%[0-9]%', X.SplitData)
FROM (
SELECT *,
CAST('<X>'+REPLACE(REPLACE(StringValue,' ',','),',','</X><X>')+'</X>' AS XML) AS XmlFilter
FROM @T F
)F1
CROSS APPLY
(
SELECT fdata.D.value('.','varchar(50)') AS SplitData
FROM f1.xmlfilter.nodes('X') AS fdata(D)) X
WHERE PATINDEX('%[0-9]%', X.SplitData) > 0),
numericCTE AS(
SELECT
ID
,AllNumeric = LEFT(SUBSTRING(SplitData, Position, LEN(SplitData)), PATINDEX('%[^0-9]%', SUBSTRING(SplitData, Position, LEN(SplitData)) + 't') - 1)
FROM SplitCTE
)
SELECT
ID
,STUFF(( SELECT ',' + c1.AllNumeric
FROM numericCTE c1
WHERE c1.ID = c2.ID
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') AS SV
FROM numericCTE c2
GROUP BY ID
/ * 结果
ID SV
1 123,2596
2 145,635,897,900
* /
但是,我完全赞同@Giorgi Nakeuri。最好使用一些编程语言(如果你可以随意使用)并使用正则表达式。你可以搞清楚,我已经两次使用REPLACE函数,首先替换空格,然后再替换逗号(,)。 希望你能继续前进。