我有一张这样的表
item
123;1;2;;
124;1;;3;
125;1;2;3;
126;;;;
...
我需要像常规表一样使用它 我怎么能得到这样的东西:
col1,col2,col3,col4 123,1,2,NULL 124,1,NULL,3 125,1,2,3 126,NULL,NULL,NULL
答案 0 :(得分:1)
但是,如果您有一些固定长度的数据或已知,那么您可以使用 xml node
方法
选择distinct&# XA; a.value('/ A [1]','VARCHAR(MAX)')=''的情况,则为null,否则a.value('/ A [1]','VARCHAR(MAX)')结束[Column1] 
 a.value('/ A [2]','VARCHAR(MAX)')=''的情况,则为null,否则a.value('/ A [2]','VARCHAR(MAX)')结束[Column2] 
当a.value('/ A [3]','VARCHAR(MAX)')=''然后为null时a.value('/ A [3]','VARCHAR(MAX)')结束[Column3] 
 a.value('/ A [4]','VARCHAR(MAX)')=''的情况,则为null,否则a.value('/ A [4]','VARCHAR(MAX)')结束[Column4] 
当a.value('/ A [5]','VARCHAR(MAX)')=''然后为null时a.value('/ A [5]','VARCHAR(MAX)')结束[Column5] 
 from
(
 SELECT CAST('< A>'+ REPLACE(ITEM,';','< / A>< A>')+'< / A>'AS XML )AS Data FROM< table_name>
)交叉应用Data.nodes('/ A')作为split(a)



 结果:


 Column1 Column2 Column3 Column4 Column5
 123 1 2 NULL NULL
 124 1 NULL 3 NULL
 125 1 2 3 NULL
 126 NULL NULL NULL NULL



 但是如果要显示 null
值,那么你可以在上面添加额外的 case
表达式条件。
答案 1 :(得分:0)
如果您使用 SQL Server 2016 ,则可以尝试使用STRING_SPLIT函数的其他方式:
DECLARE @table TABLE (
item nvarchar(max)
)
INSERT INTO @table VALUES
(N'123;1;2;;'),
(N'124;1;;3;'),
(N'125;1;2;3;'),
(N'126;;;;')
SELECT [1] as col1,
[2] as col2,
[3] as col3,
[4] as col4
FROM (
SELECT t.*,
NULLIF(t1.value,'') as [value],
ROW_NUMBER() OVER (PARTITION BY item ORDER BY item) as rn
FROM @table t
CROSS APPLY (
SELECT [value]
FROM STRING_SPLIT(item, ';')
) as t1
) as p
PIVOT (MAX(value) FOR rn in ([1],[2],[3],[4])) as pvt
输出:
col1 col2 col3 col4
123 1 2 NULL
124 1 NULL 3
125 1 2 3
126 NULL NULL NULL