Я хочу добавить новый столбец с именем «MyJsonObject» в таблицу «Тест». Новый столбец должен содержать значения только в том случае, если они истинны, а не 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     |
0
Tibor 18 Апр 2020 в 15:26

1 ответ

Вам нужно разложить элементы, а затем агрегировать их обратно:

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
0
a_horse_with_no_name 22 Апр 2020 в 10:00