【问题标题】:how to extract a particular id from the string using sql如何使用sql从字符串中提取特定的id
【发布时间】:2015-11-12 05:18:21
【问题描述】:

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

【问题讨论】:

  • 这在 sql server 中会很痛苦。使用正则表达式更好地使用某些编程语言。

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


【解决方案1】:

我真的不鼓励使用 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函数,第一次是替换空格,第二次是替换逗号(,)。 希望你能有一些想法继续前进。

【讨论】:

  • 感谢您的努力,但您只是在鼓励非常糟糕的做法。 +1 如果您删除 SQL,并在最后留下评论 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多