如何将多列合并为一个?

时间:2020-03-24 14:18:58

标签: sql postgresql

我有以下示例表:

| name   | email1          | email2            | email3         | 
.................................................................
| John   | john@gmail.com  | john@hotmail.com  | john@yahoo.com |
| Jane   | jane@gmail.com  | NULL              | NULL           |

我需要一个查询来合并电子邮件列,使其结果看起来像这样,忽略空值:

| name   | email            |
.............................
| John   | john@gmail.com   |
| John   | john@hotmail.com | 
| John   | john@yahoo.com   |
| Jane   | jane@gmail.com   |

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用横向连接:

select t.name, v.email
from t cross join lateral
     (values (email1), (email2), (email3)) v(email)
where v.email is not null;

答案 1 :(得分:0)

您可以在每个电子邮件列上union all进行一系列查询:

SELECT name, email1
WHERE  email1 IS NOT NULL
UNION ALL
SELECT name, email2
WHERE  email2 IS NOT NULL
UNION ALL
SELECT name, email3
WHERE  email3 IS NOT NULL