将逗号分隔的记录拆分为自己的行

Dim*_*las 6 postgresql string-splitting

我有下表,名为商店:

store_id INT
emails VARCHAR
Run Code Online (Sandbox Code Playgroud)

其中包含值:

商店ID 电子邮件
1 user_1@example.com,user2@example.com
2 uswe3@example.com,user4@example.com
4 admin@example.com

我想生成以下集合:

商店ID 电子邮件
1 user_1@example.com
1 user2@example.com
2 uswe3@example.com
2 user4@example.com
4 admin@example.com

正如您所看到的,我想将电子邮件字段拆分为仅包含一个电子邮件地址的单独记录。你知道我该怎么做吗?

到目前为止,我成功创建了以下查询:

select store_id,string_to_array(emails,',') from stores
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将其拆分string_to_array为自己的行。

Vér*_*ace 10

您需要UNNEST()STRING_TO_ARRAY()如下方式结合使用(此处提供小提琴):

CREATE TABLE stores
(
  store_id INTEGER NOT NULL,
  emails TEXT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

填充:

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');
Run Code Online (Sandbox Code Playgroud)

然后运行此查询:

SELECT 
  store_id,
  UNNEST(STRING_TO_ARRAY(emails, ',')) AS email
FROM stores;
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

需要注意的是 - 根据您的电子邮件在字符串中的格式,您可能需要使用该TRIM()函数来确保电子邮件中没有前置或尾随空格(如小提琴所示)。

如果您只需运行以下命令,就可以剖析发生的情况:

SELECT 
  store_id,
  STRING_TO_ARRAY(emails, ',') AS email_array
FROM stores;
Run Code Online (Sandbox Code Playgroud)

结果(请参阅更新的小提琴) - 电子邮件仍然只是一条记录 - 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}
Run Code Online (Sandbox Code Playgroud)