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);
感谢Michael提醒关于这个功能。
你真的应该重新设计你的数据库模式,以避免CSV列,如果可能的话。您应该使用数组列或单独的表。
总结以上是内存溢出为你收集整理的postgresql – 将逗号分隔的列数据拆分为其他列全部内容,希望文章能够帮你解决postgresql – 将逗号分隔的列数据拆分为其他列所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)