準備報表輸入
本例要求 sections 為陣列,只數直接物件項,第一段內的 details 不是另一段。json_tree 遞迴查後代,json_each 在 sections 路徑只訪直接子項。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 編號 | 原 JSON 文字 |
|---|---|
| A | {"sections":[{"title":"First","details":{"memo":"x"}},{"title":"Second"}]} |
CREATE TABLE documents(id TEXT PRIMARY KEY,payload TEXT NOT NULL CHECK(json_valid(payload)) CHECK(json_type(payload,'$.sections') IS 'array')); INSERT INTO documents VALUES('A','{"sections":[{"title":"First","details":{"memo":"x"}},{"title":"Second"}]}');比較錯誤及更正結果
SELECT d.id,(SELECT COUNT(*) FROM json_tree(d.payload,'$.sections') WHERE type='object') AS sections FROM documents d ORDER BY d.id;| 編號 | 直接段落數 |
|---|---|
| A | 3 |
SELECT d.id,(SELECT COUNT(*) FROM json_each(d.payload,'$.sections') WHERE type='object') AS sections FROM documents d ORDER BY d.id;| 編號 | 直接段落數 |
|---|---|
| A | 2 |
遞迴物件數三,直接段落兩。每文件用純量相關計數,sections 空時文件也仍顯示。
用新副本測邊界
清單改 [],同一文件更正段數變零。
另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。
UPDATE documents SET payload='{"sections":[]}' WHERE id='A';
SELECT d.id,(SELECT COUNT(*) FROM json_each(d.payload,'$.sections') WHERE type='object') AS sections FROM documents d ORDER BY d.id;| 編號 | 直接段落數 |
|---|---|
| A | 0 |
details 物件會增加直接段數嗎?
查看參考答案
不會,屬第一段內部,原直接數仍兩,空清單才零。