Postgresql
將逗號分隔的記錄拆分為自己的行
我有下表,命名為商店:
store_id INT emails VARCHAR
包含值:
我想生成以下集合:
如您所見,我想將電子郵件欄位拆分為僅包含一個電子郵件地址的單獨記錄。你知道我該怎麼做嗎?
到目前為止,我設法創建了以下查詢:
select store_id,string_to_array(emails,',') from stores
但我不知道如何將其拆分
string_to_array
為自己的行。
您需要
UNNEST()
與以下內容結合使用(此處STRING_TO_ARRAY()
提供小提琴):CREATE TABLE stores ( store_id INTEGER NOT NULL, emails TEXT NOT NULL );
填充:
INSERT INTO stores VALUES (1, 'user_1@example.com, user2@example.com'), (2, 'uswe3@example.com, user4@example.com'), (4, 'user_1@example.com,user2@example.com');
然後執行這個查詢:
SELECT store_id, UNNEST(STRING_TO_ARRAY(emails, ',')) AS email FROM stores;
結果:
store_id email 1 user_1@example.com 1 user2@example.com 2 uswe3@example.com 2 user4@example.com 4 user_1@example.com 4 user2@example.com
提醒一句 - 根據您的電子郵件在字元串中的格式,您可能希望使用該
TRIM()
功能來確保電子郵件中沒有前面或後面的空格(如小提琴所示)。如果您簡單地執行,您可以剖析正在發生的事情:
SELECT store_id, STRING_TO_ARRAY(emails, ',') AS email_array FROM stores;
結果(請參閱更新的小提琴) - 電子郵件仍然只是一個記錄 - UNNEST 將數組的每個單獨元素放入不同的行!:
store_id email_array 1 {user_1@example.com," user2@example.com"} 2 {uswe3@example.com," user4@example.com"} 4 {user_1@example.com,user2@example.com}