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

前端之家收集整理的这篇文章主要介绍了postgresql – 将逗号分隔的列数据拆分为其他列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在列中有逗号分隔的数据:
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列,如果可能的话。您应该使用数组列或单独的表。

原文链接:https://www.f2er.com/postgresql/193303.html

猜你在找的Postgre SQL相关文章