如何从 PostgreSQL 的单行数据库 table 中获取多行?

How to get Multiple row from a single row database table from PostgreSQL?

我有一个 PostgreSQL 数据库 table 名称 Intime

| Name  |  Intime1 |      Intime2     |   Intime3 |      Intime4     |  Intime5 |      Intime6     |
|-------|----------|------------------|-----------|------------------|----------|------------------|
| Zakir |          |    02/01/18:9.00 |           |    04/01/18:9.07 |          |    06/01/18:9.05 |

我想要这个 table:

| Name  |     Intime    |
|-------|---------------|
| Zakir | 02/01/18:9.00 |
| Zakir | 04/01/18:9.07 |
| Zakir | 06/01/18:9.05 |

现在 postgresql 中的查询是什么?

使用联合:

select name, intime1 as intime
from intime
union all
select name, intime2
from intime
union all
select name, intime3
from intime
union all
select name, intime4
from intime
union all
select name, intime5
from intime
union all
select name, intime6
from intime

另一个 - Postgres 特定 - 解决方案是在列数组上使用 unnest

select i.name, t.intime
from intime as i
  cross join unnest(array[intime1,intime2,intime3,intime4,intime5,intime6]) as t(intime);

如果你还想知道每一行属于哪一列,你可以使用with ordinality:

select i.name, t.intime, t.nr
from intime as i
  cross join unnest(array[intime1,intime2,intime3,intime4,intime5,intime6]) with ordinality as t(intime,nr);

在线示例:https://rextester.com/CDHVI81806

使用横向连接:

select t.name, v.intime
from t cross join lateral
      (values (intime1), (intime2), (intime3), (intime4), (intime5), (intime6)
      ) v(intime);

横向连接是 ANSI/ISO 非常强大的标准语法。反透视数据只是可以用它们完成的一件事。