我需要在SQL Server 2012中将一列中的字符串拆分为一个字符,并将每个字符串拆分成它自己的列。
例如:如果我有一个栏'ABCDE',我需要把它拆分成'A','B','C','D','E',与每个这些转化为自己列。
'ABCDE'
'A'
'B'
'C'
'D'
'E'
要拆分的列的长度可能会有所不同,因此我需要使其尽可能地动态。
您可以这样做:
DECLARE @t TABLE(id int, n VARCHAR(50)) INSERT INTO @t VALUES (1, 'ABCDEF'), (2, 'EFGHIJKLMNOPQ') ;WITH cte AS (SELECT id, n, SUBSTRING(n, 1, 1) c, 1 AS ind FROM @t UNION ALL SELECT id, n, SUBSTRING(n, ind + 1, 1), ind + 1 FROM cte WHERE LEN(n) > ind ) SELECT * FROM cte PIVOT (MAX(c) FOR ind IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[12],[13],[14],[15])) p
输出:
id n 1 2 3 4 5 6 7 8 9 10 12 13 14 15 1 ABCDEF A B C D E F NULL NULL NULL NULL NULL NULL NULL NULL 2 EFGHIJKLMNOPQ E F G H I J K L M N P Q NULL NULL
这是动态版本:
DECLARE @l INT, @c VARCHAR(MAX) = '' SELECT @l = MAX(LEN(n)) FROM PivotTable WHILE @l > 0 BEGIN SET @c = ',[' + CAST(@l AS VARCHAR(MAX)) + ']' + @c SET @l = @l - 1 END SET @c = STUFF(@c, 1, 1,'') DECLARE @s NVARCHAR(MAX) = ' ;WITH cte AS (SELECT id, n, SUBSTRING(n, 1, 1) c, 1 AS ind FROM PivotTable UNION ALL SELECT id, n, SUBSTRING(n, ind + 1, 1), ind + 1 FROM cte WHERE LEN(n) > ind ) SELECT * FROM cte PIVOT (MAX(c) FOR ind IN(' + @c + ')) p' EXEC (@s)