跳至內容
Astera Technology

JSON 數字 1 為何通過只收 true 的旗標報表?

要求布林原值時,須保留 JSON 來源類型。

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

準備報表輸入

本例 ready 須原 JSON 布林 true。抽出後變 SQL 整數 1,與 JSON 數字 1 一樣;查 json_type 回傳名稱 “true” 才核到原類型。ready 是本例布林報表旗標。

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

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

比較錯誤及更正結果

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

錯誤收 A=true、B=1,只有 A 符合;false、文字 true 仍不同。

用新副本測邊界

加明確 JSON null,不是真,也不入列。

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

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

B 數字一為何要剔除?

查看參考答案

原類型是 integer,不是 true。抽出純量相等仍不符本例布林類型要求。

相關資源