空 json 或错误数据查询数据

Querying data by empty json or with error data

我在 Postgresql 中有一个 table,它有一个 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

但是当我尝试在另一个查询中使用它时,它 returns 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

它似乎无法从空数组中提取数据,但实际上我不知道如何让它适用于这两种情况。

有人可以帮助我吗?

您的第二个查询引用了 table 的别名("record"),而不是 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 条件 table 会将您的外部联接变回内部联接。它实际上与

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