GOI Bible
SQLite 範例

SQLite 範例

可直接複製貼上、查詢 GOI Bible 資料庫的 SQL 範例

以下範例假設有一個資料表(或檢視表)的結構與本專案的 v_effective_rendering 檢視表相同——每節經文一列, 欄位包含 goi(貫穿全本聖經的全域序號)、 bookchapterverselang,以及 rendering(該節經文文字)。 用 sqlite3 指令列工具,或 DB Browser for SQLite 等 圖形介面工具打開 GOI_bible.sqlite3,即可直接執行以下任一查詢。

1. 如何產生整本聖經

依正典順序輸出某一語言版本的每一節經文:

SELECT book, chapter, verse, rendering
FROM v_effective_rendering
WHERE lang = 'zh'
ORDER BY goi;

goi(「全域序號」)本身就已經編碼了從創世記到啟示錄 正確的閱讀順序,所以單純 ORDER BY goi 即可—— 不需要額外的書卷編號對照表。

2. 如何只取出某一章,並附上節號

取出單一章,並在每一行旁附上節號,適合研讀/查閱版面:

SELECT verse, rendering
FROM v_effective_rendering
WHERE book = 'JHN' AND chapter = 3 AND lang = 'zh'
ORDER BY verse;

若想要不含節號、文字連貫的「閱讀版面」, 可省略 verse 欄位,改用 group_concat(rendering, ' ') 將同一章的經文串接起來。

3. 如何製作熱圖(heatmap)

統計某個詞在每一章出現的次數,作為熱圖的數據來源 (顏色越深表示出現次數越多)。以下範例統計「愛」:

SELECT book, chapter,
       (LENGTH(group_concat(rendering, ' '))
        - LENGTH(REPLACE(group_concat(rendering, ' '), '愛', '')))
       / LENGTH('愛') AS hits
FROM v_effective_rendering
WHERE lang = 'zh'
GROUP BY book, chapter
ORDER BY hits DESC;

結果是每章一列、附帶出現次數 hits—— 可直接餵給任何圖表套件(例如以 book/chapter 為座標的日曆式熱圖),視覺化呈現某個詞在全書中的分布密度。

4. 如何搜尋「光」與「暗」相距 10 節以內的經文

一般的 LIKE 查詢無法表達「相鄰」的概念—— 這時可以建立一個 FTS5 虛擬資料表, 將每節經文「前後 10 節」的範圍視為一份文件, 再使用 FTS5 的 NEAR 運算子:

-- 一次性設定:以每節經文前後 ±10 節作為一份 FTS5 文件
CREATE VIRTUAL TABLE verse_windows USING fts5(window_text, goi UNINDEXED);

INSERT INTO verse_windows(goi, window_text)
SELECT v.goi,
       (SELECT group_concat(w.rendering, ' ')
        FROM v_effective_rendering w
        WHERE w.lang = 'zh' AND w.goi BETWEEN v.goi - 10 AND v.goi + 10)
FROM v_effective_rendering v
WHERE v.lang = 'zh';

-- 查詢:在同一個 ±10 節範圍內,「光」與「暗」相距 10 個詞以內的經文
SELECT vr.book, vr.chapter, vr.verse, vr.rendering
FROM verse_windows fw
JOIN v_effective_rendering vr ON vr.goi = fw.goi AND vr.lang = 'zh'
WHERE fw.window_text MATCH '光 NEAR/10 暗';

verse_windows 只需建立一次(或在文字更新時重新整理)—— 建好之後,上面的 MATCH 查詢即可在整本聖經範圍內瞬間完成。