如何在postgresql中生成序列

时间:2013-11-08 07:17:28

标签: postgresql

当我执行以下查询时。

选择      30,60,90,120,150,180 从     表

我得到enter image description here

以下的输出

但是我的愿望输出就像,只想在一栏中。

 sequence 
   30
   60
   90
   120
   150
   180

这可能吗?

4 个答案:

答案 0 :(得分:3)

使用适用于所有主要RDBMS的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

或使用postgres'generate_series()功能

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

输出:

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

以下是两个查询的 SQLFIddle 演示

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

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

另外,如果您的RDMBS支持窗口函数,并且您有一些表,并且您知道此表中至少存在6行,则可以执行以下操作:)

select
    row_number() over(order by id) * 30
from temp
limit 6

<强> sql fiddle demo

答案 3 :(得分:1)

正如其他答案所提到的,当你想要生成的数据是这样的偶数间隔系列时,generate_series就是你的选择。如果没有,我喜欢a_horse_with_no_name的版本。另一种方式是:

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