Один из вариантов - использовать подход, описанный ниже, содержащий функции JSON_LENGTH()
, JSON_EXTRACT()
и JSON_SEARCH()
вместе, даже для версии 5.7
(5.7.13+
), где массив (js
) извлечен в подзапросе, и они разделены на отдельные массивы для каждого значения (true
и false
) с использованием функции JSON_SEARCH()
, содержащей all
в качестве второго аргумента, а затем подсчитываются функцией 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
Демо