【问题标题】:Querying jsonb in postgresql在postgresql中查询jsonb
【发布时间】:2019-06-23 13:32:03
【问题描述】:

我的 postgresql 数据库表中有一个名为 authors 的 jsonb 列,其中包含如下数据:

[{"id":134,"nameKey":"smith, john"},
 {"id":112,"nameKey":"bats, billy"}]

如何从表中返回 jsonb 作者列包含 id 为 112 的作者的所有行?

我需要类似的东西

select * from record
where authors -> id = 2

我还需要得到名字:

select * from gardner_record
where authors -> nameKey like '%john%'

我发现几乎无法理解 postgresql jsonb 文档。当我尝试按 ID 选择时,它说我缺少演员表。当我尝试按名称选择时,它说该列不存在。

我应该如何查询此列?

【问题讨论】:

  • 是jsonb中的数组还是jsonb[]类型?
  • 它原本是文本列,但我想查询它,所以我将类型更改为 jsonb。我应该设置类型 jsonb[] 吗?我是 jsonb 的新手,没有找到任何合适的教程
  • 不,没关系。我认为您必须使用遏制运算符。 @>
  • SELECT * FROM record where authors <@ '{"id": 1}'::jsonb 运行没有错误,但不返回任何结果。我认为这是一个对象,但我有一个对象数组,但我不知道如何修改它。我想我需要使用json_array_elements,但我不知道如何使用。

标签: postgresql


【解决方案1】:

使用jsonb_array_elements

select t.*
    from t cross join jsonb_array_elements(authors) as j
    where j->>'id' = '112'



select t.*
    from t cross join jsonb_array_elements(authors) as j
    where j->>'nameKey' like '%john%'

DEMO

【讨论】:

  • 我看了演示,似乎是同时选择了两个元素。
  • @AvinKavish :是的,如果只想选择匹配的元素,可以使用select j from ..。见Demo。但 OP 似乎想要表格中的列。
  • 所以要澄清一下,在没有连接的情况下,在运算符中没有看写 where 子句?即where array contains element that matches predicate
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2022-10-14
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多