通过空json或错误数据查询数据

时间:2019-05-08 14:31:39

标签: postgresql jsonb

我在Postgresql中有一个表,其中有一个jsonb列。该列可以具有3种类型的数据,格式如下:

  1. [],如果结果为空;
  2. [{"items": [{"name": "item1", "value": "value1", "messages": []}]}]"
  3. [{"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

似乎无法从一个空数组中提取数据,但是我实际上不知道如何使它们在两种情况下都可以工作。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

第二个查询引用表的别名(“记录”),而不是jsonb_array_elements返回的实际值。

您需要将其更改为:

SELECT * 
FROM my_table t1
  LEFT JOIN jsonb_array_elements(t1.my_column) with ordinality AS items(item) ON true
where item.item -> 'items' -> 0 ->> 'name' <> 'error'

请注意,外部联接表上的where条件会将您的外部联接转换回内部联接。实际上与

相同
SELECT * 
FROM my_table t1
  JOIN jsonb_array_elements(t1.my_column) AS items(item) 
    ON items.item -> 'items' -> 0 ->> 'name' <> 'error'