将字符串列拆分为行并删除原始行 - postgres

时间:2017-06-13 05:00:59

标签: postgresql

我是postgresql的业余爱好者,我希望将逗号分隔列拆分为多列。我设法将列拆分为行,并根据使用此代码

的分隔字符串数插入新行
INSERT INTO myTable (username, town)
SELECT 
    username, 
    regexp_split_to_table(town, E',') 
FROM myTable;

现在我想要实现的是从数据库中删除原始列。任何意见,将不胜感激。

This SQLFiddle显示了我到目前为止所做的工作!

2 个答案:

答案 0 :(得分:1)

显而易见的方法是简单地删除包含;的行。没有新行可以包含分隔符,因为它不会被regexp_split_to_table()返回。

delete from yourtable
where town like '%;%';

假设表格中有(生成的)主键(例如名为id),另一种选择是使用data modifying CTE

with old_data as (
  select id, username, town
  from yourtable
), new_data as (
  -- this will generate new primary key values not present in "old_data"
  insert into yourtable (username, town)
  select username, regexp_split_to_table(town, ';')
)
delete from yourtable
where id in (select id from old_data);

您的SQL小提琴和您的问题不一致。小提琴使用,,但您的问题使用;作为分隔符。我使用;与您的问题保持一致

答案 1 :(得分:1)

您可以简单地标记“旧记录”然后删除它们并删除所有标志,如下所示:

ALTER TABLE yourTable ADD COLUMN new BOOLEAN DEFAULT false;
INSERT INTO yourTable (username, town, new)
SELECT 
    username, 
    regexp_split_to_table(town, E','),
    true
FROM yourTable;

DELETE FROM yourTable WHERE new = false;

ALTER TABLE yourTable DROP COLUMN new;