如何拆分SQL表str列中字符串的字母与数字并分行存储?
解决方案
要实现将字符串中的字母段与数字段分离并拆分到新行,你可以先在字母和数字的交界处插入分隔符,再使用STRING_SPLIT拆分处理后的字符串。以下是纯T-SQL的实现方法:
1. 示例表与数据
假设你的表名为YourTable,先创建并插入示例数据:
CREATE TABLE YourTable (ID INT, STR VARCHAR(50)); INSERT INTO YourTable VALUES (1, 'AB1234KK'), (2, 'ABC123DEF'), (3, '1234AB');
2. 拆分逻辑实现
通过递归CTE在字母与数字的转换位置插入分隔符,再拆分字符串:
WITH SplitCTE AS ( SELECT ID, STR AS OriginalStr, -- 定位字母转数字、数字转字母的位置 PATINDEX('%[A-Z][0-9]%', STR) AS AlphaToNumPos, PATINDEX('%[0-9][A-Z]%', STR) AS NumToAlphaPos, STR AS ModifiedStr FROM YourTable UNION ALL SELECT ID, OriginalStr, PATINDEX('%[A-Z][0-9]%', ModifiedStr), PATINDEX('%[0-9][A-Z]%', ModifiedStr), -- 在交界位置插入逗号分隔符 CASE WHEN AlphaToNumPos > 0 AND (NumToAlphaPos = 0 OR AlphaToNumPos < NumToAlphaPos) THEN STUFF(ModifiedStr, AlphaToNumPos + 1, 0, ',') WHEN NumToAlphaPos > 0 THEN STUFF(ModifiedStr, NumToAlphaPos + 1, 0, ',') ELSE ModifiedStr END FROM SplitCTE WHERE AlphaToNumPos > 0 OR NumToAlphaPos > 0 ), FinalStrings AS ( -- 取每个ID处理完成的最终字符串 SELECT ID, ModifiedStr FROM SplitCTE WHERE AlphaToNumPos = 0 AND NumToAlphaPos = 0 ) -- 拆分字符串并输出结果 SELECT fs.ID, s.value AS STR FROM FinalStrings fs CROSS APPLY STRING_SPLIT(fs.ModifiedStr, ',') s ORDER BY fs.ID, CHARINDEX(s.value, fs.ModifiedStr);
结果说明
执行后会得到你期望的输出:
| ID | STR |
|---|---|
| 1 | AB |
| 1 | 1234 |
| 1 | KK |
| 2 | ABC |
| 2 | 123 |
| 2 | DEF |
| 3 | 1234 |
| 3 | AB |
内容的提问来源于stack exchange,提问作者nrc
相关产品推荐
相关产品推荐

