如何使用sql从字符串中提取特定的id

时间:2015-11-12 05:18:22

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

我想从表中的记录中提取特定的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

1 个答案:

答案 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函数,首先替换空格,然后再替换逗号(,)。 希望你能继续前进。