0

I have in mysql json field with the values:

{"a": true, "b":true, "c":false, "d":true}

I want to retrieve in SQL, for each row, only the keys and values that are true.

For example in the row:

{"a": true, "b":true, "c":false, "d":true}

the result will be:

{"a": true, "b":true, "d":true}

How can I do it?

Thank you!

aspp
  • 21
  • 2

1 Answers1

3

Using string (regex) functions:

SELECT id,
       val, 
       REGEXP_REPLACE(REGEXP_REPLACE(val, '(, *)?"[^"]+": *false', ''), '\\{ *, *', '\\{') without_false
FROM test

Using recursive CTE:

WITH RECURSIVE
cte AS ( SELECT id, val src, val FROM test
         UNION ALL
         SELECT id, 
                src,
                JSON_REMOVE(val, JSON_UNQUOTE(JSON_SEARCH(REPLACE(val, 'false', '"false"'), 'one', 'false')))
         FROM cte
         WHERE JSON_SEARCH(REPLACE(val, 'false', '"false"'), 'one', 'false') IS NOT NULL
         )
SELECT id, src val, val without_false
FROM cte
WHERE JSON_SEARCH(REPLACE(val, 'false', '"false"'), 'one', 'false') IS NULL

fiddle

Akina
  • 39,301
  • 5
  • 14
  • 25