【问题标题】:How to get Multiple row from a single row database table from PostgreSQL?如何从 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 中的查询是什么?

【问题讨论】:

    标签: sql postgresql union unpivot


    【解决方案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:抱歉,有一个错字( 而不是[
      猜你喜欢
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多