Как изменить массив на jsonb с данными?

У меня есть столбец массива с такими данными:

{foo,bar}
{foo}
{foo,foobar}
...

и я хочу преобразовать его в jsonb:

[{"my_key": "foo", "state": true}, {"my_key": "bar", "state": true}]
[{"my_key": "foo", "state": true}]
[{"my_key": "foo", "state": true}, {"my_key": "foobar", "state": false}]
...

где "государство"

case when type = ANY('{"foo","bar"}'::text[]) then true
else false

Как я могу это сделать? Спасибо

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это:

begin;

create table t (keys text[]);

insert into t values ('{"foo","bar"}'), ('{"foo"}'), ('{"foo","foobar"}');

create or replace function array2jsonb(a text[]) returns jsonb AS $$
    DECLARE
        k text;                 -- the current key
        j jsonb := '[]'::jsonb; -- the jsonb array we collect the objects in
    BEGIN
        -- We loop over each key in the given array.
        FOREACH k IN ARRAY a
        LOOP
            -- Concat a JSON object to the JSON array for every key in the array.
            j = j || ('{"my_key":"' || k || '","state":' ||
                case when k = ANY('{"foo","bar"}'::text[])
                     then true
                     else false
                     end || '}')::jsonb;
        END LOOP;
        return j;
    END
$$ LANGUAGE plpgsql;

select array2jsonb(keys) from t;

rollback;

Результат:

+--------------------------------------------------------------------------+
| array2jsonb                                                              |
|--------------------------------------------------------------------------|
| [{"state": true, "my_key": "foo"}, {"state": true, "my_key": "bar"}]     |
| [{"state": true, "my_key": "foo"}]                                       |
| [{"state": true, "my_key": "foo"}, {"state": false, "my_key": "foobar"}] |
+--------------------------------------------------------------------------+

Использованная литература:

Ответ принят как подходящий

Вы можете отменить вложение значений и агрегировать их обратно с помощью бокового соединения:

with t (data) as (
values 
  (array['foo','bar']),
  (array['foo']),
  (array['foo', 'foobar'])
)
select x.*
from t
  cross join lateral (
      select jsonb_agg(jsonb_build_object(
                          'my_key', x.type, 
                          'state', x.type = any(array['foo','bar']))
                       ) as val
      from unnest(t.data) as x(type)
  ) x;

возвращает:

val                                                                     
------------------------------------------------------------------------
[{"state": true, "my_key": "foo"}, {"state": true, "my_key": "bar"}]    
[{"state": true, "my_key": "foo"}]                                      
[{"state": true, "my_key": "foo"}, {"state": false, "my_key": "foobar"}]

Онлайн-пример: https://rextester.com/MWUER75686

Другие вопросы по теме