小巧。快速。可靠。
三者选其二。
generate_series 表值函数

1. 概述

generate_series(START,STOP,STEP) 表值函数 是 SQLite 源代码树中包含的一个 可加载扩展,并编译到 命令行 shell 中。generate_series() 表有一个可见的结果列,名为“value”,其中包含整数类型的值,行数由参数 START、STOP 和 STEP 决定。表的第一行值为 START。后续行以 STEP 为增量,直到不超过 STOP 的值。

generate_series() 表还有一些隐藏的列,名为“start”、“stop”和“step”,其值分别为 START、STOP 和 STEP 的有效值(提供或默认为值)。它还有一个 rowid,可以通过其常用的名称访问。

省略的参数将采用默认值。STEP 默认为 1。STOP 默认为 4294967295。从 3.37.0(2021-11-27)及更高版本开始,START 参数是必需的,如果省略 START 或其值为自引用或无法计算的值,则会引发错误。旧版本使用 0 作为 START 的默认值。可以通过使用 -DZERO_ARGUMENT_GENERATE_SERIES 编译来从最近的代码中获得遗留行为。

1.1. 等效的递归公用表表达式

对于正步长值,可以使用 递归公用表表达式 模拟 generate_series 表。如果三个参数为 $start、$end 和 $step,则等效的公用表表达式为

WITH RECURSIVE generate_series(value) AS (
  SELECT $start
  UNION ALL
  SELECT value+$step FROM generate_series
   WHERE value+$step<=$end
) ...

公用表表达式无需加载扩展即可工作。另一方面,扩展更容易编程且速度更快。

2. 使用示例

生成所有小于或等于 100 的 5 的倍数

SELECT value FROM generate_series(5,100,5);

生成 20 个随机整数

SELECT random() FROM generate_series(1,20);

查找每个客户的名称,其账户号码是在 10000 和 20000 之间的 100 的偶数倍。

SELECT customer.name
  FROM customer, generate_series(10000,20000,100)
 WHERE customer.id=value;
/* or */
SELECT name FROM customer
 WHERE id IN (SELECT value
                FROM generate_series(10000,20000,200));

此页面上次修改于 2023-05-01 21:49:55 UTC