【发布时间】:2019-05-08 14:31:38
【问题描述】:
我在 Postgresql 中有一个包含 jsonb 列的表。该列可以有3种类型的数据,结构如下:
-
[]如果结果为空; [{"items": [{"name": "item1", "value": "value1", "messages": []}]}]"[{"items": [{"name": "error", "value": "some error", "messages": []}]}]
如果第一项不是错误,我必须显示数据。而且我有一个界面来获取所有错误。
我正在使用COUNT WHERE FILTER 来计算空和错误,它正在工作。
这是示例查询:
SELECT COUNT(*) FILTER (WHERE t1.my_column = '[]' OR items -> 'items' -> 0 ->> 'name' = 'error') --This works
FROM my_table t1
LEFT JOIN jsonb_array_elements(CAST(t1.my_column AS jsonb)) AS items ON TRUE
但是当我尝试在另一个查询中使用它时,它会返回 cannot extract elements from an object:
SELECT t1.id, t1.column1, ...
FROM my_table t1
LEFT JOIN jsonb_array_elements(CAST(t1.my_column AS jsonb)) AS items ON TRUE
WHERE t1.my_column <> '[]' --This works
OR items -> 'items' -> 0 ->> 'name' <> 'error' --This doesn't
它似乎无法从空数组中提取数据,但我实际上不知道如何使它适用于这两种情况。
有人可以帮我吗?
【问题讨论】:
-
不相关,但是:如果列已经是jsonb,那么为什么
cast(t1.my_column AS jsonb)? -
你所追求的输出究竟是什么?
-
@a_horse_with_no_name from this second query: getting all my data where this column does not have an empty json array or does not have the first item with name error.
标签: postgresql jsonb