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选择一行:但是这会选择值作为列而不是行,并且需要在查询中指定所有值,而不是仅使用我的开始值和结束值:0和4.
在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 0和SELECT 4?
在SQL Server(和PostgreSQL)中,我将使用递归公用表表达式:SQL Server,PostgreSQL
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)
但是,据我所知,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 来测试它。
感谢您的所有回答!经过讨论,我意识到使用数字表并不太复杂,并且在两个/多个平台上运行良好且快速:
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)
您只需创建此表一次,并且可以在需要一系列数字时使用它。
| 归档时间: |
|
| 查看次数: |
14134 次 |
| 最近记录: |