【问题标题】:Querying data by empty json or with error data通过空json或错误数据查询数据
【发布时间】:2019-05-08 14:31:38
【问题描述】:

我在 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

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

有人可以帮我吗?

【问题讨论】:

  • 不相关,但是:如果列已经是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


【解决方案1】:

您的第二个查询引用了表的别名(“记录”),而不是 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'

【讨论】:

  • 可以测试您的第二个示例。第一个返回相同的错误消息。我猜它无法从空 json 中提取数据。
猜你喜欢
  • 2021-07-26
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
相关资源
最近更新 更多