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

Posted

技术标签:

【中文标题】如何从 PostgreSQL 的单行数据库表中获取多行?【英文标题】:How to get Multiple row from a single row database table from PostgreSQL? 【发布时间】:2018-10-22 10:19:52 【问题描述】:

我有一个 PostgreSQL 数据库表名 Intime

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

我想要这张桌子:

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

现在 postgresql 中的查询是什么?

【问题讨论】:

【参考方案1】:

使用横向连接:

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

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

【讨论】:

【参考方案2】:

使用 UNION:

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

【讨论】:

亲爱的“a_horse_with_no_name” 您的第二个查询不起作用。请你再检查一遍。谢谢你的第一个。 @ZakirHossain:抱歉,有一个错字( 而不是[

以上是关于如何从 PostgreSQL 的单行数据库表中获取多行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgreSQL 表中检索随机数据行?

postgresql - 计划将数据从 dblink 插入到本地表中

如何从具有时间框架属性的表中获取数据库记录?

PostgreSQL - 从数据库表中提取列名、数据类型和样本值

如何从表中获取字段列表和不同值

如何在 Postgresql 交叉表中获取动态列数