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 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
我知道您想有一个可以轻松使用多个数字列表作为参数的查询。使用数组:
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
我需要 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 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
我知道您想有一个可以轻松使用多个数字列表作为参数的查询。使用数组:
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