SQL 2019如何使用Cross Apply与String_split拆分列内容实现行转列
实现方案
该需求完全可以实现,以下是基于SQL Server 2019的实现代码和说明:
前置说明
SQL Server 2019的STRING_SPLIT暂不支持返回拆分后的序号,如果你不需要严格保证拆分后行的顺序和原字符串中标识的顺序一致,以下方案可直接使用。如果需要保留顺序,可以替换为OPENJSON拆分逻辑,核心清洗规则通用。
步骤1:构造测试数据(可跳过,直接替换为你的业务表即可)
DECLARE @data TABLE (ID INT, [Column X] NVARCHAR(MAX)) INSERT INTO @data VALUES (1, 'I (a)Some Text (b)Some more Text (c) Text'), (2, '1a Some Text b Some more text c')
步骤2:实现拆分(输出你要求的中间效果)
SELECT d.ID, TRIM(s.value) AS [Column X] FROM @data d CROSS APPLY STRING_SPLIT( -- 预处理字符串:给所有a/b/c标识前加统一分隔符~,~可替换为业务内容中不存在的任意特殊字符 REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(d.[Column X], '(a)', '~(a) '), '(b)', '~(b) '), '(c)', '~(c) '), ' a ', '~a '), ' b ', '~b '), ' c ', '~c '), '~' ) s WHERE TRIM(s.value) <> '' -- 过滤空值 AND TRIM(s.value) NOT LIKE 'I' -- 过滤第一条数据开头的无效前缀,可根据实际业务规则调整
步骤3:最终清洗(移除a/b/c标识)
SELECT ID, TRIM(CASE WHEN [Column X] LIKE '(a)%' THEN STUFF([Column X], 1, 3, '') WHEN [Column X] LIKE '(b)%' THEN STUFF([Column X], 1, 3, '') WHEN [Column X] LIKE '(c)%' THEN STUFF([Column X], 1, 3, '') WHEN [Column X] LIKE 'a %' THEN STUFF([Column X], 1, 2, '') WHEN [Column X] LIKE 'b %' THEN STUFF([Column X], 1, 2, '') WHEN [Column X] LIKE 'c %' THEN STUFF([Column X], 1, 2, '') ELSE [Column X] END) AS [Column X] FROM ( SELECT d.ID, TRIM(s.value) AS [Column X] FROM @data d CROSS APPLY STRING_SPLIT( REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(d.[Column X], '(a)', '~(a) '), '(b)', '~(b) '), '(c)', '~(c) '), ' a ', '~a '), ' b ', '~b '), ' c ', '~c '), '~' ) s WHERE TRIM(s.value) <> '' AND TRIM(s.value) NOT LIKE 'I' ) t
扩展说明
如果你的标识不止a/b/c,最多到z,可以扩展嵌套的REPLACE逻辑即可,无需调整整体结构。
内容的提问来源于stack exchange,提问作者Deen
相关产品推荐
相关产品推荐

