将CSV值转换/查询为/作为表

时间:2017-11-10 12:41:41

标签: sql-server csv sql-server-2016

我有一张这样的表

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

2 个答案:

答案 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