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

Juv*_*uve 10 sql sqlite postgresql sequence

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

期望的输出关系:

# x
  0
  1
  2
  3
  4
Run Code Online (Sandbox Code Playgroud)

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

在Postgres中,你有一个generate_series针对这种情况的特殊功能:

SELECT * FROM generate_series(0,4) x;
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM [0..4]
Run Code Online (Sandbox Code Playgroud)

也许使用SEQUENCE声明或一些神奇的组合SELECT 0SELECT 4

Rom*_*kar 5

在SQL Server(和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
Run Code Online (Sandbox Code Playgroud)

SQL范例

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

因此,可能的解决方案可能是

  • 创建用户定义的函数(可能会有所帮助)
  • 创建一个表,该表的数字从0到您需要的最大数字,然后像这样从中进行选择:

    select Number from Numbers where Number >= 0 and Number <= 4
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

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

sqlite> select 1 union select 2 union select 3;
1
2
3
Run Code Online (Sandbox Code Playgroud)

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

select 1 from dual union select 2 from dual union select 3 from dual;
Run Code Online (Sandbox Code Playgroud)

但我没有一个 Oracle DB 来测试它。


Juv*_*uve 1

感谢您的所有回答!经过讨论,我意识到使用数字表并不太复杂,并且在两个/多个平台上运行良好且快速:

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
Run Code Online (Sandbox Code Playgroud)

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