我在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 |
正如我在评论中提到的,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,因为这是撰写本文时的最新版本。