Given a JSON object:
SET @j := '{"BOOSTER": 1, "RETRO": 2, "GUIDANCE": 0,
"SURGEON": 1, "RECOVERY": 0}';
How do you find the keys which do NOT contain a value of 0?
One approach is to find the keys which do match 0, and then
remove them.
Sounds like JSON_SEARCH and JSON_REMOVE? But there’s a gotcha:
JSON_SEARCH works only with strings. Ok, so we
REPLACE(@j, ‘0’, ‘”0″‘) – but that doesn’t help, because
JSON_REMOVE can’t accept an array of paths like JSON_SEARCH would
return; it requires each path as a separate parameter.
Instead, JSON_MERGE_PATCH will suffice. It has the feature that
values from the second parameter are preserved only if they are
not NULL. So, the approach becomes turning the 0s into NULLs, and
then merging that document into an empty one.
SELECT REPLACE(@j, 0, 'null') AS j; -- …
[Read more]