一个选项将使用以下方法,其中包含JSON_LENGTH()、JSON_EXTRACT() 和JSON_SEARCH() 函数,即使对于版本5.7 (5.7.13+),其中一个数组(js) 在子查询中提取并且它们'通过使用包含all 作为第二个参数的JSON_SEARCH() 函数将每个值(true 和false)拆分为单独的数组,然后由JSON_LENGTH() 函数计数:
SELECT ID,
JSON_LENGTH( JSON_SEARCH(js, 'all', 'true') ) AS Cnt_True,
JSON_LENGTH( JSON_SEARCH(js, 'all', 'false') ) AS Cnt_False
FROM ( SELECT *, JSON_EXTRACT(jsdata, '$.*') AS js
FROM tab ) t
提供的 JSON 字段具有引用值,例如 "true" 和 "false"
JSON_EXTRACT(jsdata, '$.*') 仍然可以在布尔值未引用的情况下使用,就像您的情况一样。但是,这一次将需要一些字符串操作。在这里,我更喜欢使用CHAR_LENGTH() 函数:
SELECT ID,
CHAR_LENGTH(js) - CHAR_LENGTH(REPLACE(js, 'true', SPACE(LENGTH('true')-1)))
AS Cnt_True,
CHAR_LENGTH(js) - CHAR_LENGTH(REPLACE(js, 'false', SPACE(LENGTH('false')-1)))
AS Cnt_False
FROM
( SELECT *, JSON_EXTRACT(jsdata, '$.*') AS js
FROM tab ) t
Demo