postgresql – 将逗号分隔的列数据拆分为其他列

postgresql – 将逗号分隔的列数据拆分为其他列,第1张

概述我在列中有逗号分隔的数据: Column ------- a,b,c,d 我想将逗号分隔的数据分成多个列,以获得此输出: Column1 Column2 Column3 Column4 ------- ------- ------- -------a b c d 如何实现呢? 如果CSV中的字段数是常量,那么你可以这样做: select a[1], 我在列中有逗号分隔的数据:
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 – 将逗号分隔的列数据拆分为其他列所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1171604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存