选择一个特定数字范围的“假”列

时间:2016-07-15 20:11:32

标签: sql postgresql postgresql-8.4

我需要选择表格的 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;

3 个答案:

答案 0 :(得分:3)

鉴于你的意见:

  

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

这会创建所谓的cartesian product。这是使用cross join union 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

答案 1 :(得分: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)

答案 2 :(得分:1)

@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