Фильтровать JSON объект по значениям true, NULL или 'null' - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу добавить новый столбец с именем «MyJsonObject» в таблицу «Test». Новый столбец должен содержать значения только в том случае, если они имеют значение true, а не NULL или 'null' как текст.

NULL как значение можно отфильтровать с помощью json_strip_nulls, но как я могу отфильтровать другие значения, false и 'null' как текст?

json_strip_null работает только для значений NULL

myjsonstring                                                           |
-----------------------------------------------------------------------|
{"column_1":false,"column_2":false,"column_3":true,"column_4":"red"}   | 
{"column_1":false,"column_2":false,"column_3":true,"column_4":"yellow"}| 
{"column_1":false,"column_2":true,"column_3":true}                     | 
{"column_1":true,"column_2":false,"column_3":true,"column_4":"NULL"}   |

Хочу получить:

myjsonstring                                                           |
-----------------------------------------------------------------------|
{"column_3":true,"column_4":"red"}   |
{"column_3":true,"column_4":"yellow"}|
{"column_2":true,"column_3":true}    |
{"column_1":true,"column_3":true     |

1 Ответ

0 голосов
/ 22 апреля 2020

Вам нужно откатить элементы и затем объединить их обратно:

select t.myjsonstring, x.new_json
from the_table t
  cross join lateral (
    select jsonb_object_agg(k,v) as new_json
    from jsonb_each(t.myjsonstring) as j(k,v)
    where v is not null
      and v::text not in ('false', 'NULL')
  ) as x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...