分隔字符串中字母和数字的函数

问题描述 投票:0回答:1

我在str列中有字符串

身份证 STR
1 AB1234KK
2 ABC123DEF
3 1234AB

我需要将每条记录上的字母和数字分开,并将它们放在一个新行上。 我尝试使用 STRING_SPLIT 函数,它允许我在字母和数字之间放置分隔符并将它们分开。但我不知道怎么办。

我期待这样的结果

身份证 STR
1 AB
1 1234
1 KK
2 ABC
2 123
2 防御
3 1234
3 AB
sql sql-server t-sql split
1个回答
0
投票

正如我在评论中提到的,T-SQL 确实不是理想的语言,但话虽这么说,你可以做到这一点。我在这里使用的方法是使用

GENERATE_SERIES
SUBSTRING
为值中的每个字符创建一行,然后使用“旧”
ROW_NUMBER
方法计算出它们所在的“组”。然后我可以在各个组中使用
STRING_AGG
聚合各个字符。这会产生如下所示的解决方案:

WITH Grps AS(
    SELECT V.ID,
           V.Str,
           GS.value,
           SS.C,
           ROW_NUMBER() OVER (PARTITION BY V.ID ORDER BY GS.value) - 
           ROW_NUMBER() OVER (PARTITION BY V.ID, CASE WHEN SS.C LIKE '[0-9]' THEN 1
                                                      WHEN SS.C LIKE '[A-z]' THEN 2
                                                 END ORDER BY GS.value) AS Grp
    FROM (VALUES(1,'AB1234KK'),
                (2,'ABC123DEF'),
                (3,'1234AB'))V(ID,Str)
         CROSS APPLY GENERATE_SERIES(1,LEN(Str))GS
         CROSS APPLY (VALUES(SUBSTRING(V.[Str],GS.[value],1)))SS(C))
SELECT G.ID,
       STRING_AGG(G.C,'') WITHIN GROUP (ORDER BY value) AS NewStr
FROM Grps G
GROUP BY G.ID,
         G.Grp
ORDER BY G.ID,
         G.Grp;

如果您有任何其他非字母数字字符,那么这些字符将隐式分为第三组。

但是,这仅适用于 SQL Server 2022+。如果您使用的是 2019 年以上,那么您需要将

GENERATE_SERIES
函数替换为您自己的计数函数。如果您不是使用 SQL Server 2017+,那么您还需要将
STRING_AGG
替换为旧的
FOR XML PATH
(和
STUFF
)解决方案(您将能够使用以下命令找到这两个解决方案)您最喜欢的搜索引擎)。由于此处没有标记版本,我假设您使用的是 2022,因为这是撰写本文时的最新版本。

© www.soinside.com 2019 - 2024. All rights reserved.