为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

将逗号分隔的列数据拆分为其他列我在列中有逗号分隔的数据:Column  -------  a,b,c,d我想将逗号分隔数据拆分为多个列以获得此输出:Column1  Column2 Column3 Column4  -------  ------- ------- ------- a        b       c       d怎么能实现这一目标?
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

如果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

然后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_to_array而不是regexp_split_to_array:


select ...

from (

    select string_to_array(csv, ',')

    from csvs

) as dt(a);

感谢Michael提供有关此功能的提醒。


您真的应该重新设计数据库架构,以便尽可能避免使用CSV列。您应该使用数组列或单独的表。


查看完整回答
反对 回复 2019-08-13
?
开满天机

TA贡献1786条经验 获得超13个赞

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(可能的最大值)。超出数据项的列将为空字符串('')。


查看完整回答
反对 回复 2019-08-13
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

您可以使用拆分功能。

    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


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 694 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信