小巧、快速、可靠。
任選三項。
generate_series 表值函數

1. 概觀

generate_series(START,STOP,STEP) 表值函數 是包含在 SQLite 原始碼樹中並編譯到 命令列外殼 中的 可載入擴充功能。generate_series() 表有一個可見的結果欄位,稱為「value」,其中包含整數值,而列數則由 START、STOP 和 STEP 參數決定。該表的第 1 列值為 START。後續列會以 STEP 為增量遞增,直到值不超過 STOP。

generate_series() 表有其他隱藏的欄位,稱為「start」、「stop」和「step」,其值分別為 START、STOP 和 STEP 的有效值(已提供或預設)。它也有 rowid,可透過其通常的名稱存取。

省略的參數會採用預設值。STEP 預設為 1。STOP 預設為 4294967295。從版本 3.37.0(2021-11-27)開始,START 參數是必要的,如果省略 START 或其值具有自參照或無法計算,則會產生錯誤。舊版本對 START 使用預設值 0。最近的程式碼可透過編譯 -DZERO_ARGUMENT_GENERATE_SERIES 取得舊版行為。

1.1. 等效的遞迴共用表格表達式

對於正向的 step 值,可以使用 遞迴共用表格表達式 模擬 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