我在列中有逗号分隔的数据:
Column ------- a,b,c,d
我想将逗号分隔的数据分成多个列,以获得此输出:
Column1 Column2 Column3 Column4 ------- ------- ------- ------- a b c d
如何实现呢?
如果CSV中的字段数是常量,那么你可以这样做:
select a[1],a[2],a[3],a[4] from ( select regexp_split_to_array('a,d',',') ) as dt(a)
例如:
=> select a[1],a[4] from (select regexp_split_to_array('a,')) 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
然后为您的查询构建适当的a [1],a [2],…,a [M]列列表。所以如果上面给你最多6,你会使用这个:
select a[1],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,3,4 1,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[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_to_array
而不是regexp_split_to_array:
select ... from ( select string_to_array(csv,') from csvs ) as dt(a);
你真的应该重新设计你的数据库模式,以避免CSV列,如果可能的话。您应该使用数组列或单独的表。