如何在PostgreSQL中生成序列

3
当我执行以下查询时: 我得到了如下输出:enter image description here
但是我想要的输出结果是,只在一列中输出:
序列
   30
   60
   90
   120
   150
   180
这是否有可能?
4个回答

6

使用UNION ALL,它可以在所有主要的关系型数据库管理系统中工作。

SELECT 30 "sequence" UNION ALL
SELECT 60 UNION ALL
SELECT 90 UNION ALL
SELECT 120 UNION ALL
SELECT 150 UNION ALL
SELECT 180

或者使用PostgreSQL的generate_series()函数。

SELECT * 
  FROM generate_series(30, 180, 30) "sequence";

输出:

| SEQUENCE |
|----------|
|       30 |
|       60 |
|       90 |
|      120 |
|      150 |
|      180 |

这是用于两个查询的SQLFIddle演示


2
我会删除第一个版本。第二个是唯一的正确方式。 - Bohemian

1
比使用 UNION ALL 稍微短一点:
select *
from ( values (30), (60), (90), (120), (150), (180) ) as numbers (seq_no);

另外一种选择:
with numbers (seq_num) as (
  values (30), (60), (90), (120), (150), (180)
)
select *
from numbers;

1

正如 @peterm 所说,在 PostgreSQL 中使用 generate_series() 是正确的方法。

在其他支持递归 CTE 的 RDBMS 中,您可以像这样使用它:

with recursive cte(sequence) as (
    select 30
    union all
    select sequence + 30
    from cte
    where sequence < 180
)
select *
from cte

此外,如果你的关系数据库支持窗口函数,并且你有一些表,而且你知道这个表中至少总是存在6行,那么你可以这样做:)
select
    row_number() over(order by id) * 30
from temp
limit 6

SQL Fiddle演示


1

正如其他答案所提到的那样,如果您要生成的数据是均匀分布的系列,则generate_series是正确的选择。如果不是,我喜欢a_horse_with_no_name的版本。另一种方法是:

select unnest('{30,60,90,120,150,180}'::int[]) as numbers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接