检查嵌套对象中是否存在布尔值

Check if boolean value present in nested object

我有一个 JSON 列,存储的数据如下所示:

{"results":{"made":true,"cooked":true,"eaten":true}}
{"results":{"made":true,"cooked":true,"eaten":false}}
{"results":{"made":true,"eaten":true,"a":false,"b":true,"c":false}, "more": {"ignore":true}}

我需要找到 $.results 中 1+ 个值是 false 的所有行。

我尝试使用 JSON_CONTAINS() 但没有找到一种方法让它与布尔值 JSON 进行比较,或者查看 $.results 中的所有值。

这需要使用 MySQL 5.7,但如果不可能,我会接受 MySQL 8+ 的答案。

我不知道如何使用 JSON 函数搜索 JSON true/false/null 值 - 实际上,这些值在搜索过程中被视为字符串类型值JSON_CONTAINS、JSON_SEARCH 等

使用正则表达式进行检查。像

SELECT id, 
       JSON_PRETTY(jsondata)
FROM test
WHERE jsondata REGEXP '"results": {[^}]+: false.*}';

DEMO

您可以通过这种方式使用 LIKE 条件简单地搜索 JSON_EXTRACT

SELECT * FROM table1 WHERE JSON_EXTRACT(json_dict, '$.results') LIKE '%: false%';

勾选这个DB FIDDLE

其他答案中模式匹配的替代方法是从 $.results 中提取所有值并使用助手 table 和 运行 数字

检查每个条目
SELECT DISTINCT v.id, v.json_value
FROM (
 SELECT id, json_value, JSON_EXTRACT(json_value, '$.results.*') value_array
 FROM json_table
) v
JOIN seq ON seq.n < JSON_LENGTH(v.value_array)
WHERE JSON_EXTRACT(v.value_array, CONCAT('$[', seq.n, ']')) = false

Here is the demo