sqlite.com上的json_each文档很简短。
以下内容可能有助于更好地理解如何使用json_each和其他json函数。
创建一个名为JsonTest
的表。列Reply
包含json值。
CREATE TABLE "JsonTest" (
"Id" INTEGER NOT NULL UNIQUE,
"Reply" TEXT,
PRIMARY KEY("Id" AUTOINCREMENT)
)
向表中插入一些记录
INSERT INTO JsonTest (Reply)
SELECT
'{"id": 2, "status": "ok", "body": [{"Ftr": "Gears", "Val": "10"},{"Ftr": "Brake", "Val": "Disc-Brake"}]}' as REPLY
UNION SELECT '{"id": 4, "status": "ok", "body": [{"Ftr": "Gears", "Val": "12"},{"Feature": "Brake", "Val": "Disc-Brake"}]}'
UNION SELECT 'Error'
UNION SELECT '{"id": 1, "status": "nok", "body": "empty"}'
UNION SELECT 'Error'
UNION SELECT '{"id": 5, "status": "nok", "body": "empty"}'
UNION SELECT '{"id": 6, "status": "ok", "body": [{"Ftr": "Gears", "Val": "21"},{"Ftr": "Brake", "Val": "V-Brake"}]}'
UNION SELECT '{"id": 8, "status": "ok", "body": [{"Ftr": "Gears", "Val": "18"},{"Ftr": "Brake", "Val": "V-Brake"}]}';
正如您所见
- 一些行仅包含
Error
,并且不是有效的JSON
- 其他行具有有效的JSON对象,属性
body
要么是empty
的值,要么是类似以下结构的数组类型的值
[
{"Ftr": "Gears", "Val": "21"},
{"Ftr": "Brake","Val": "V-Brake"}
]
如果列
Reply
始终具有有效的JSON值,例如
'{"id": 5, "status": "nok" ...}
,我们可以像这样查询JSON字段状态:
SELECT JsonTest.id, jsonEach.Value
FROM JsonTest,json_each(JsonTest.Reply, '$.status') as jsonEach
WHERE JsonTest.Reply not like 'Error';
![sqlite json](https://istack.dev59.com/A1epk.webp)
但是由于某些行/记录不是有效的json,因此可以使用类似于这样的子查询 (SELECT *, ...) as sq
结合 json_each(Reply, ...)
来过滤所有具有有效json的记录 WHERE JSON_VALID(Reply)
。
SELECT subquery.RecordId, subquery.Reply_id, jsonEach.value
FROM
(
SELECT *, Id as RecordId, json_extract(Reply, '$.id') as Reply_id
FROM JsonTest
WHERE JSON_VALID(Reply)
AND json_extract(Reply, '$.status') like "ok"
AND json_extract(Reply, '$.body[1].Val') like "V-Brake"
) as subquery, json_each(Reply, '$.body') as jsonEach;
在
sqlite-browser 中,这将返回此结果。
![sqlite_json_each](https://istack.dev59.com/qkeIU.webp)