generate_series 表值函数

、概述

generate_series(START,END,STEP)表值函数包含在 SQLite 源代码树中的可加载扩展,并编译到命令行 shell中。generate_series() 表有一个名为“value”的结果列,其中包含整数值和由参数 START、END 和 STEP 确定的行数。表的第一行的值为 START。随后的行按 STEP 增加,直到 END。

省略的参数采用默认值。STEP 默认为 1。END 默认为 9223372036854775807。从版本 3.37.0 (2021-11-27) 及更高版本开始,START 参数是必需的,如果 START 被省略或具有自引用或其他不可计算的值,则会引发错误. 旧版本对 START 使用默认值 0。通过使用 -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));