【问题标题】:select a "fake" column that is a range of specific numbers选择一个特定数字范围的“假”列
【发布时间】:2016-07-15 20:11:32
【问题描述】:

我需要选择表格的 a 信息以及一系列特定数字,也就是说,对于每个 a.id 我想显示该范围内的每个数字, 使用 PostgreSQL 8.4

假设范围是数字 123、175 和 192,这将是我想要的结果:

范围a.id
123   1    
175   1    
192   1    
123   2    
175   2    
192   2    
123   3
175   3    
192   3    

我知道我可以使用

select range, a.id
from a
inner join generate_series(1, 100, 1) range on true

但问题是,我不想使用generate_series,因为我的范围是随机数,还有其他方法吗?

可能是这样的:

select range, a.id
from a
where range in (123, 175, 192)
group by range, a.id;

【问题讨论】:

  • 我想我现在明白了。因此,您有一个名为 a 的表,其中包含一个 id 列,并且您正在尝试返回具有这些值的范围?哪个范围应该与价值相配?最后一个查询有 5 个范围 - 如果表 a 只有 3 行,为什么 123 会与 1 一起使用?
  • 对于每个a.id,我想显示范围的每个数字
  • @sgeddes 我刚刚意识到我写了一个我想要的错误示例,我现在已经更正了。

标签: sql postgresql postgresql-8.4


【解决方案1】:

鉴于您的评论:

对于每个 a.id,我想显示范围的每个数字

这会创建所谓的cartesian product。这是一个使用cross joinunion all 的通用选项:

select a.id, r.rng
from a cross join (
  select 123 as rng 
  union all select 234
  union all select 556
  union all select 653
  union all select 634) r

【讨论】:

  • 在示例中,我的范围只有 3 个数字,但实际上从 3 到几千不等,我感谢您的贡献,但觉得它不太优雅。
  • @EdsonHoracioJunior -- 如果你有一千个随机数,你必须以某种方式把它们写出来。使用union all 只是一个例子。由于您使用的是postrgesql,因此更短的替代方法是使用values 列表:postgresql.org/docs/current/static/queries-values.html。你仍然需要交叉连接,但至少你不必多次写union all....
  • @EdsonHoracioJunior -- 在此处查看此答案:stackoverflow.com/questions/6683429/…
【解决方案2】:

我了解您希望有一个查询,您可以轻松地将多个数字的列表用作参数。使用数组:

with a(id) as (values (1), (2), (3))

select rng, id
from unnest(array[123, 175, 192]) rng
cross join a;

 rng | id 
-----+----
 123 |  1
 175 |  1
 192 |  1
 123 |  2
 175 |  2
 192 |  2
 123 |  3
 175 |  3
 192 |  3
(9 rows)

【讨论】:

    【解决方案3】:

    @sgeddes@klin 的答案贡献了很多,即使我已经接受了答案,我写这篇文章是为了描述 3 个我发现有效且“优雅”的解决方案。可悲的是,我不知道哪个表现更好。

    // This is the one I'm using
    select unnest(array[123, 175, 192]), a.id
    from a
    group by range, a.id
    
    select range, a.id
    from a
    inner join (values (123), (175), (192)) data(range) on true
    group by range, a.id
    
    select range, a.id
    from a
    inner join unnest(array[123, 175, 192]) range on true
    group by range, a.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-10
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多