检查嵌套对象中是否存在布尔值
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.*}';
您可以通过这种方式使用 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
我有一个 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.*}';
您可以通过这种方式使用 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