从包含数字列表的“无”中选择关系的快速/可读方式是什么。我想通过设置开始和结束值来定义哪些数字。我正在使用Postgres SQL和SQLite,并且会对可以在两个/多个平台上运行的泛型解决方案感兴趣。
期望的输出关系:
# x
0
1
2
3
4
我知道我可以从“无”中选择一行:SELECT 0,1,2,3,4
但是这会将值选为列而不是行,并且需要在查询中指定所有值,而不是仅使用我的开始值和结束值:0
和4
。
在Postgres中,对于这种情况,您有一个特殊的generate_series
函数:
SELECT * FROM generate_series(0,4) x;
这很好用,但不标准。我也可以想象一些使用临时表的复杂解决方案,但我希望有一些通用和简单的东西:
SELECT * FROM [0..4]
也许使用SEQUENCE
语句或SELECT 0
和SELECT 4
的某种神奇组合?
答案 0 :(得分:5)
在SQL服务器(和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
但据我所知,SQLite中没有WITH。
所以,可能的解决方案可能是
创建一个表格,其中包含您需要的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将是直截了当的。