将列数据分为两列并将其插入到Postgresql中的现有表中

时间:2019-06-03 06:13:47

标签: postgresql split

将列数据分为两列,并将其插入到postgresql中的现有表中。

Email
-----
xyz@outlook.com,xyz2@outlook.com

想像下面这样隔离:

Email1 Email2
-------------
xyz@outlook.com       xyz2@outlook.com
    insert into s_mas_enrich (email_1, Email_2)
select *,
    split_part(email::TEXT,',', 1) Email_1,
    split_part(email::TEXT,',', 2) Email_2
    from s_mas_enrich 

2 个答案:

答案 0 :(得分:1)

使用联合查询:

insert into Table_Name (Email)
select split_part(email::TEXT,',', 1) from s_mas_enrich
union all
select split_part(email::TEXT,',', 2) from s_mas_enrich;

这假设您的目标表Table_Name仅具有一个目标电子邮件列,但是您想同时包含s_mas_enrich表中的这两个CSV电子邮件。

答案 1 :(得分:0)

我们可以使用string_to_array完成拆分操作,如下所示:

postgres=# select string_to_array('yz@outlook.com,xyz2@outlook.com',',');
          string_to_array          
-----------------------------------
 {yz@outlook.com,xyz2@outlook.com}
(1 row)

postgres=# select (string_to_array('yz@outlook.com,xyz2@outlook.com',','))[1] as email1;
     email1     
----------------
 yz@outlook.com
(1 row)

postgres=# select (string_to_array('yz@outlook.com,xyz2@outlook.com',','))[2] as email2;
      email2      
------------------
 xyz2@outlook.com
(1 row)

postgres=# select (string_to_array('yz@outlook.com,xyz2@outlook.com',','))[1] as email1,(string_to_array('yz@outlook.com,xyz2@outlook.com',','))[2] as email2;
     email1     |      email2      
----------------+------------------
 yz@outlook.com | xyz2@outlook.com

postgres=# insert into table_name (email_1, email_2)
select
    (string_to_array(email::varchar,','))[1],
    (string_to_array(email::varchar,','))[2]
from
    s_mas_enrich

注意:PostgreSQL的数组索引从1开始,而不是零。