postgres конвертирует массив json в столбцы

Я работаю в postgres 9.6 и все еще не понимаю json

у меня есть столбец с объектом json, который представляет собой массив чисел, представляющих частоту повторения и дни недели.

{"every":"1","weekdays":["1"]}
{"every":"1","weekdays":["1","3"]}
{"every":"1","weekdays":["1","2","3","4","5"]}

ROW1 -[1]          : MON  
ROW2 -[1,3]        : MON , WED  
ROW3 -[1,2,3,4,5]  : MON , TUE , WED , THU , FRI  

Я хочу развернуть их в столбцы так, чтобы:

|ROW- |MON | TUE| WED|THU|FRI|  
------------------------------
|ROW1 |Y   |N   |N   |N  |N  |  
|ROW2 |Y   |N   |Y   |N  |N  |  
|ROW3 |Y   |Y   |Y   |Y  |Y  |  

Я могу получить элементы, используя jsonb_array_elements(pattern), но что дальше?

я думал использовать выражение «содержит» для построения каждого столбца

pattern @> '{1}', pattern @> '{2}' и т. д., но я не мог построить объект, который мог бы нанести удар


person Darryl    schedule 22.03.2018    source источник
comment
Не могли бы вы также добавить свой json к вопросу? Это может облегчить понимание.   -  person Pitto    schedule 22.03.2018


Ответы (2)


Пример данных:

create table my_table(id serial primary key, pattern jsonb);
insert into my_table (pattern) values
('{"weekdays": [1]}'),
('{"weekdays": [1, 3]}'),
('{"weekdays": [1, 2, 3, 4, 5]}');

Вы можете использовать оператор @> следующим образом:

select 
    id,
    pattern->'weekdays' @> '[1]' as mon,
    pattern->'weekdays' @> '[2]' as tue,
    pattern->'weekdays' @> '[3]' as wed,
    pattern->'weekdays' @> '[4]' as thu,
    pattern->'weekdays' @> '[5]' as fri
from my_table

 id | mon | tue | wed | thu | fri 
----+-----+-----+-----+-----+-----
  1 | t   | f   | f   | f   | f
  2 | t   | f   | t   | f   | f
  3 | t   | t   | t   | t   | t
(3 rows)    
person klin    schedule 22.03.2018

Кажется, я был на правильном пути с «содержит», но я запутался в том, что было в массиве. Я должен был искать строку, а не число

, bookings.pattern->'weekdays' @> '"1"'::jsonb

Спасибо Pitto за подсказку указать внешний json в вопросе, который сделал это очевидным.

person Darryl    schedule 22.03.2018
comment
я раньше не замечал, но внешний json - это {каждый: 1, будние дни: [1,4,5]}, но когда я запрашиваю массив «дни недели», я получаю [1,4,5], что меня немного сбило - person Darryl; 22.03.2018