14

什么是从包含数字列表的“无”中选择关系的快速/可读方法。我想通过设置开始值和结束值来定义哪些数字。我正在使用 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]

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

4

6 回答 6

8

在 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

SQL 提琴示例

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

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

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

    select Number from Numbers where Number >= 0 and Number <= 4
    
于 2013-07-16T10:16:08.400 回答
5

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

于 2013-08-02T00:52:45.537 回答
2

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

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

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

于 2013-08-21T08:47:12.050 回答
2

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

select (0) as count union values (1),(2),(3),(4),(5)

用代码扩展这个 sql 将是直截了当的。

于 2017-03-16T11:21:22.310 回答
0

这对我来说适用于 MS SQL。这有点作弊,因为它要求您要查询的表的行数至少与您要返回的数字数量一样多。在我的例子中,我只想要一个包含五个优先级的列表,我可以将它们绑定到一个下拉列表 - 但鉴于其他相关 UI 元素的工作方式,它必须来自 SQL:

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
于 2021-11-30T02:16:09.600 回答
0

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

SELECT
    *
FROM (VALUES (1),(2), (3))
于 2022-02-28T11:37:45.893 回答