跳至內容
Astera Technology

空明細報表為何把物件當空陣列?

先核 JSON 種類,才解讀陣列長度。

下載完整個案資料及參考答案 ↓

準備報表輸入

本例要真正空的 lines 陣列。json_array_length 對找到的非陣列也回零,所以只查零會收物件。須同時種類 array、長度零;格式合法不代表形狀相同。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:documents
編號原 JSON 文字
A{"lines":[]}
B{"lines":{}}
C{"lines":[1]}
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE documents(id TEXT PRIMARY KEY,payload TEXT NOT NULL CHECK(json_valid(payload))); INSERT INTO documents VALUES('A','{"lines":[]}'),('B','{"lines":{}}'),('C','{"lines":[1]}');

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT id FROM documents WHERE json_array_length(payload,'$.lines')=0 ORDER BY id;
錯誤查詢的逐行結果
編號
A
B
下載可編輯 CSV ↓
更正 SELECT
SELECT id FROM documents WHERE json_type(payload,'$.lines')='array' AND json_array_length(payload,'$.lines')=0 ORDER BY id;
更正查詢的逐行結果
編號
A
下載可編輯 CSV ↓

A 為 []、B 為 {}、C 為 [1],只有 A 是空陣列。B 是另一形狀須另查,不是零明細文件。

用新副本測邊界

加 lines:null,仍不入空陣列結果。

另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。

邊界改動及更正查詢
INSERT INTO documents VALUES('D','{"lines":null}');
SELECT id FROM documents WHERE json_type(payload,'$.lines')='array' AND json_array_length(payload,'$.lines')=0 ORDER BY id;
邊界查詢的逐行結果
編號
A
下載可編輯 CSV ↓

長度回零本身可證明空陣列嗎?

查看參考答案

不能,要種類核對才分得空陣列與物件或 null。

相關資源