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)
归档时间: |
|
查看次数: |
11961 次 |
最近记录: |