在 Sqlite 查询中使用 JSON 谓词来获取数组项
Use a JSON predicate in Sqlite query to get an array item
我正在尝试使用谓词从 Sqlite 中的 JSON 数组中检索单个项目。
这是我的示例数据集:
{
"book": [
{
"author": "Nigel Rees",
"category": "reference",
"price": 8.95,
"title": "Sayings of the Century"
},
{
"author": "Herman Melville",
"category": "fiction",
"isbn": "0-553-21311-3",
"price": 8.99,
"title": "Moby Dick"
},
{
"author": "J.R.R. Tolkien",
"category": "fiction",
"isbn": "0-395-19395-8",
"price": 22.99,
"title": "The Lord of the Rings"
}
]
}
我只想检索价格为 22.99 的商品。
在 XPath 中我会做这样的事情://book[@price='22.99']
我在网上尝试了一些 JSON 路径评估器 (https://jsonpath.com/),这应该有效:$.book[?(@.price == 22.99)]
但是,当我尝试在 Sqlite 中的 SELECT
查询中使用相同的路径时,它会抛出以下异常:
Result: JSON path error near '[?(@.price == 22.99)]'
我错过了什么吗?当我尝试没有谓词的路径时(比如 $.book[2].title
),它起作用了。
我的完整 SQL 查询是(JSON 在 content
字段中):
SELECT Json_extract(content, '$.book[?(@.price == 22.99)]')
FROM json_test
WHERE id = 1
PS:我知道我可以使用 WHERE
语句进行查询,但我更愿意仅使用 JSON 路径使其工作。
大致如下:
SELECT j.value
FROM json_test AS jt
JOIN json_each(jt.content, '$.book') AS j
WHERE jt.id = 1 AND json_extract(j.value, '$.price') = 22.99
如果要过滤 json 对象中的值,则无法避免使用 WHERE
。
我正在尝试使用谓词从 Sqlite 中的 JSON 数组中检索单个项目。
这是我的示例数据集:
{
"book": [
{
"author": "Nigel Rees",
"category": "reference",
"price": 8.95,
"title": "Sayings of the Century"
},
{
"author": "Herman Melville",
"category": "fiction",
"isbn": "0-553-21311-3",
"price": 8.99,
"title": "Moby Dick"
},
{
"author": "J.R.R. Tolkien",
"category": "fiction",
"isbn": "0-395-19395-8",
"price": 22.99,
"title": "The Lord of the Rings"
}
]
}
我只想检索价格为 22.99 的商品。
在 XPath 中我会做这样的事情://book[@price='22.99']
我在网上尝试了一些 JSON 路径评估器 (https://jsonpath.com/),这应该有效:$.book[?(@.price == 22.99)]
但是,当我尝试在 Sqlite 中的 SELECT
查询中使用相同的路径时,它会抛出以下异常:
Result: JSON path error near '[?(@.price == 22.99)]'
我错过了什么吗?当我尝试没有谓词的路径时(比如 $.book[2].title
),它起作用了。
我的完整 SQL 查询是(JSON 在 content
字段中):
SELECT Json_extract(content, '$.book[?(@.price == 22.99)]')
FROM json_test
WHERE id = 1
PS:我知道我可以使用 WHERE
语句进行查询,但我更愿意仅使用 JSON 路径使其工作。
大致如下:
SELECT j.value
FROM json_test AS jt
JOIN json_each(jt.content, '$.book') AS j
WHERE jt.id = 1 AND json_extract(j.value, '$.price') = 22.99
如果要过滤 json 对象中的值,则无法避免使用 WHERE
。