Postgresql

將逗號分隔的記錄拆分為自己的行

  • June 4, 2021

我有下表,命名為商店:

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}

引用自:https://dba.stackexchange.com/questions/292705