postgres 将 json 数组转换为列

postgres convert json array to columns

我正在使用 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) 取出元素,但是然后呢?

我想使用 'contains' 表达式来构建每一列

pattern @> '{1}'pattern @> '{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)    

我似乎在 'contains' 的正确轨道上,但我对数组中的内容感到困惑。我应该一直在寻找一个字符串而不是一个数字

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

感谢 Pitto 提示将外部 json 放在问题中,这使它变得显而易见