select 一个 "fake" 列,它是一个特定数字的范围

select a "fake" column that is a range of specific numbers

我需要 select table 的 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;

鉴于您的评论:

For every a.id I want to show every number of the range

这将创建所谓的 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

我知道您想有一个可以轻松使用多个数字列表作为参数的查询。使用数组:

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)

@sgeddes and @klin 答案做出了很大贡献,尽管我已经接受了一个答案,但我写这篇文章是为了描述我发现有效的 3 个解决方案,它们是 "elegant"。可悲的是,我不知道哪个表现更好。

// 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