SQL:从“无”中选择一个数字列表

时间:2013-07-16 10:00:57

标签: sql sqlite postgresql sequence

从包含数字列表的“无”中选择关系的快速/可读方式是什么。我想通过设置开始和结束值来定义哪些数字。我正在使用Postgres SQL和SQLite,并且会对可以在两个/多个平台上运行的泛型解决方案感兴趣。

期望的输出关系:

# x
  0
  1
  2
  3
  4

我知道我可以从“无”中选择一行:SELECT 0,1,2,3,4但是这会将值选为列而不是行,并且需要在查询中指定所有值,而不是仅使用我的开始值和结束值:04

在Postgres中,对于这种情况,您有一个特殊的generate_series函数:

SELECT * FROM generate_series(0,4) x;

这很好用,但不标准。我也可以想象一些使用临时表的复杂解决方案,但我希望有一些通用和简单的东西:

SELECT * FROM [0..4]

也许使用SEQUENCE语句或SELECT 0SELECT 4的某种神奇组合?

4 个答案:

答案 0 :(得分:5)

在SQL服务器(和PostgreSQL)中,我会使用递归公用表表达式:SQL ServerPostgreSQL

with recursive Numbers as (
    select 0 as Number
    union all
    select Number + 1
    from Numbers
    where Number < 4
)
select Number
from Numbers

SQL FIDDLE EXAMPLE

但据我所知,SQLite中没有WITH。

所以,可能的解决方案可能是

  • 创建用户定义的函数(this可能会有所帮助)
  • 创建一个表格,其中包含您需要的0到最大数字的数字,然后只需从中选择:

    select Number from Numbers where Number >= 0 and Number <= 4
    

答案 1 :(得分:4)

在PostgreSQL和SQLite中执行此操作的简单方法如下:

sqlite> select 1 union select 2 union select 3;
1
2
3

它应该适用于大多数RDBMS系统,但是您必须使用Oracle中的IIRC:

select 1 from dual union select 2 from dual union select 3 from dual;

但我没有Oracle DB来测试它。

答案 2 :(得分:2)

感谢所有答案! 在讨论之后,我意识到使用numbers table并不是太复杂,并且在两个/多个平台上运行良好且快速:

CREATE TABLE integers (i integer);
INSERT INTO integers (i) VALUES (0);
INSERT INTO integers (i) VALUES (1);
...
INSERT INTO integers (i) VALUES (9);
SELECT (hundreds.i * 100) + (tens.i * 10) + units.i AS x
FROM integers AS units
  CROSS JOIN integers AS tens
  CROSS JOIN integers AS hundreds

您只需创建一次此表,并可在需要一系列数字时使用它。

答案 3 :(得分:0)

其他一些替代方案(在postgres中尝试过,但应该与其他人合作)

Seconds seconds = Seconds.secondsBetween(dateTime, now);

使用代码扩展此sql将是直截了当的。