【问题标题】:Select from JSON Array postgresql JSON column从 JSON 数组 postgresql JSON 列中选择
【发布时间】:2020-08-17 10:40:05
【问题描述】:

我在 PostgreSQL JSON 列中存储了以下 JSON

{
  "status": "Success",
  "message": "",
  "data": {
    "serverIp": "XXXX",
    "ruleId": 32321,
    "results": [
      {
        "versionId": 555555,
        "PriceID": "8abf35ec-3e0e-466b-a4e5-2af568e90eec",
        "price": 550,
        "Convert": 0.8922953080331764,
        "Cost": 10
      }
    ]
  }
}

我想在整个 JSON 列(名称信息)中搜索特定的 priceID,并通过 PriceID 选择整个结果元素。 我如何在 postgresql JSON 中做到这一点?

【问题讨论】:

    标签: sql arrays json postgresql select


    【解决方案1】:

    一个选项使用existsjson(b)_array_elements()。假设您的表名为 mytable 并且 jsonb 列是 mycol,则如下所示:

    select t.*
    from mytable t
    where exists (
        select 1
        from jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
        where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
    )
    

    在子查询中,jsonb_array_elements() 取消嵌套位于给定路径的 json 数组。然后,where 子句确保数组中至少有一个元素具有给定的PriceID

    如果您的数据是json 数据类型而不是jsonb,则需要使用json_array_elements() 而不是jsonb_array_elements()


    如果你想显示一些来自匹配数组元素的信息,那就不同了。您可以使用lateral join 代替exists。但请记住,如果多个数组元素匹配,这将重复行:

    select t.*, x.elt ->> 'price' price
    from mytable t
    cross join lateral jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
    where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
    

    【讨论】:

    • 这太棒了!非常感谢你不知道我尝试了多少不同的查询我怎样才能在结果数组中获取特定元素,例如价格,我还能得到整个结果数组吗?再次感谢
    • 感谢您的回复,效果很好,但是当我使用整数值尝试相同的操作时,我收到一条错误消息:错误:运算符不存在:文本 = 整数从 mytable 中选择 t.* t where exists (select 1 from jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt) where x.elt ->> 'cost' = 800 )
    • @OferB:你需要转换成正确的数据类型,所以要么(x.elt ->> 'cost')::int = 800要么x.elt ->> 'cost' = 800::text
    • 这样尝试过: select json_array_elements(t.info -> 'data' -> 'results') ->> 'Cost' from table t where exists ( select from json_array_elements(t.info - > 'data' -> 'results') x(elt) where (x.elt ->> 'ID')::int = 10 ) 我得到的结果是 ID=10 和 ID=1 我只需要 10 ,我做错了什么?
    猜你喜欢
    • 2020-08-30
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2021-12-18
    • 2015-11-12
    • 2020-12-15
    • 2021-12-11
    相关资源
    最近更新 更多