postgresql SQL:从“nothing”中选择数字列表

fumotvh3  于 2023-03-12  发布在  PostgreSQL
关注(0)|答案(7)|浏览(156)

什么是一个快速/可读的方法来选择一个关系从“nothing”包含一个数字列表。我想通过设置一个开始和结束值定义哪些数字。我正在使用Postgres SQL和SQLite,并会有兴趣在通用解决方案,将工作在两个/许多平台。
所需输出关系:

# x
  0
  1
  2
  3
  4

我知道我可以从“nothing”中选择一行: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的某种神奇组合?

bn31dyow

bn31dyow1#

那么在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混乱示例

但是,据我所知,SQLite中没有WITH。
所以,可能的解决方案是

  • 创建一个用户定义的函数(this可能会有帮助)
  • 创建一个表,表中的数字从0到所需的最大数字,然后像这样从中进行选择:
select Number from Numbers where Number >= 0 and Number <= 4
r6vfmomb

r6vfmomb2#

在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数据库来测试它。

wfypjpf4

wfypjpf43#

一些其他的选择(在postgres中尝试,但应与其他人合作)
select (0) as count union values (1),(2),(3),(4),(5)
用代码扩展这个sql将非常简单。

bvuwiixz

bvuwiixz4#

谢谢大家的回答!讨论结束后,我意识到使用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

您只需创建此表一次,就可以在需要某个数字范围时使用它。

5t7ly7z5

5t7ly7z55#

这对我在MS SQL中是有效的。这是一个小欺骗,因为它要求你查询的表至少有你想要返回的数字数量一样多的行数。在我的例子中,我只是想要一个五个优先级的列表,我可以绑定到一个下拉列表-但必须来自SQL,因为其他相关的UI元素的工作方式:

SELECT WDPRIORITY, 
       CAST('Priority ' + LTRIM(STR(WDPRIORITY)) AS CHAR(16)) AS TXPRIORITY
  FROM (
         SELECT TOP 5 ROW_NUMBER() OVER(ORDER BY WDVALUE ASC) AS WDPRIORITY
           FROM VMIPRS
       ) AS VMPRIORITY
ax6ht2ek

ax6ht2ek6#

如果有人正在寻找解决方案的MSSQL已知的有限数量的数字:

SELECT x.x FROM (VALUES (1),(2),(3),(4)) AS x(x)
ztmd8pv5

ztmd8pv57#

如果数量有限,我会选择:

SELECT
    *
FROM (VALUES (1),(2), (3))

相关问题