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 放在问题中,这使它变得显而易见
我正在使用 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 放在问题中,这使它变得显而易见