2017-06-13 82 views
0

我是postgresql的業餘愛好者,我期待將逗號分隔的列拆分爲許多列。我設法我的專欄分成數行,並插入基於分開的串號新行使用此代碼將字符串列拆分成行並刪除原始行 - postgres

INSERT INTO myTable (username, town) 
SELECT 
    username, 
    regexp_split_to_table(town, E',') 
FROM myTable; 

現在我要實現的是,從數據庫中刪除原始列。任何意見,將不勝感激。

This SQLFiddle顯示了我迄今爲止所做的!

+0

在表上沒有主鍵? –

+0

@a_horse_with_no_name好吧,它只是一個小提琴。但我真的不知道。它真的是必要的嗎?這會有幫助嗎?如何? – moay

+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小提琴和你的問題是不一致。小提琴使用,,但您的問題使用;作爲分隔符。我用;是你的問題

+0

謝謝你的時間。我非常感謝幫助。我不熟悉「with」語法,應該學習它,但它幫助我解決了這個問題。謝謝。 – moay

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; 
+0

謝謝你的時間。它真的幫了大忙! – moay

+0

比使用'with'的解決方案更容易理解 – Pachonk