拆分逗号分隔列数据到其他列

我在一列中有逗号分隔的数据:

Column ------- a,b,c,d 

我想将逗号分隔的数据分成多列来获得这个输出:

 Column1 Column2 Column3 Column4 ------- ------- ------- ------- abcd 

这怎么能实现?

如果CSV中的字段数量不变,那么你可以这样做:

 select a[1], a[2], a[3], a[4] from ( select regexp_split_to_array('a,b,c,d', ',') ) as dt(a) 

例如:

 => select a[1], a[2], a[3], a[4] from (select regexp_split_to_array('a,b,c,d', ',')) as dt(a); a | a | a | a ---+---+---+--- a | b | c | d (1 row) 

如果CSV中的字段数量不是固定的,那么可以通过如下方式获得最大数量的字段:

 select max(array_length(regexp_split_to_array(csv, ','), 1)) from your_table 

然后为您的查询构build适当a[1], a[2], ..., a[M]列列表。 所以如果上面给了你最多6,你会使用这个:

 select a[1], a[2], a[3], a[4], a[5], a[6] from ( select regexp_split_to_array(csv, ',') from your_table ) as dt(a) 

如果需要,可以将这两个查询合并成一个函数。

例如,给这个数据(最后一行是NULL):

 => select * from csvs; csv ------------- 1,2,3 1,2,3,4 1,2,3,4,5,6 (4 rows) => select max(array_length(regexp_split_to_array(csv, ','), 1)) from csvs; max ----- 6 (1 row) => select a[1], a[2], a[3], a[4], a[5], a[6] from (select regexp_split_to_array(csv, ',') from csvs) as dt(a); a | a | a | a | a | a ---+---+---+---+---+--- 1 | 2 | 3 | | | 1 | 2 | 3 | 4 | | 1 | 2 | 3 | 4 | 5 | 6 | | | | | (4 rows) 

由于你的分隔符是一个简单的固定string,你也可以使用string_to_array而不是regexp_split_to_array

 select ... from ( select string_to_array(csv, ',') from csvs ) as dt(a); 

感谢迈克尔提醒这个function。

如果可能的话,您应该重新devise数据库模式以避免CSV列。 您应该使用数组列或单独的表。

split_part()在一个步骤中做你想做的事情:

 SELECT split_part(col, ',', 1) AS col1 , split_part(col, ',', 2) AS col2 , split_part(col, ',', 3) AS col3 , split_part(col, ',', 4) AS col4 FROM tbl; 

添加尽可能多的行,你有col (可能的最大值)的项目。 超过数据项的列将是空string( '' )。

你可以使用分割function。

  SELECT (select top 1 item from dbo.Split(FullName,',') where id=1 ) Column1, (select top 1 item from dbo.Split(FullName,',') where id=2 ) Column2, (select top 1 item from dbo.Split(FullName,',') where id=3 ) Column3, (select top 1 item from dbo.Split(FullName,',') where id=4 ) Column4, FROM MyTbl