【问题标题】:Select Unique value from a JSON Array - PostgreSQL JSON column从 JSON 数组中选择唯一值 - PostgreSQL JSON 列
【发布时间】:2020-08-30 03:37:11
【问题描述】:

我在 PostgreSQL JSON 列中存储了以下 JSON 文档:

{
  "status": "Success",
  "message": "",
  "data": {
    "serverIp": "XXXX",
    "ruleId": 32321,
    "results": [
      {
        "versionId": 555555,
        "PriceID": "8abf35ec-3e0e-466b-a4e5-2af568e90eec",
        "price": 350,
        "Convert": 0.8,
        "Cost": 15
        "Customer_ID":1
      },
      {
        "versionId": 4444,
        "PriceID": "b5a1dbd5-17b4-4847-8b3c-da334f95276a",
        "price": 550,
        "Convert": 0.7,
        "Cost": 10,
        "Customer_ID":10
      }
    ]
  }
}

我正在尝试检索特定 customer_ID 的价格 我正在使用此查询来获取 Customer_ID=1 的价格

select json_array_elements(t.info -> 'data' -> 'results') ->> 'price'
from mytable  t
where exists (
    select 
    from json_array_elements(t.info -> 'data' -> 'results') x(elt)
    where (x.elt ->> 'Customer_ID')::int = 1
)

问题是对于 Customer_ID=1 和 Customer_ID=10 我得到相同的结果 我基本上得到了数组的两个元素,而不仅仅是一个。 我不知道我做错了什么

【问题讨论】:

    标签: sql arrays json postgresql select


    【解决方案1】:

    您可以使用横向连接来取消嵌套数组元素,然后使用where 子句过滤客户;这样您就只剩下一行,您可以从中提取价格:

    select x.elt ->> 'price' price
    from mytable t 
    cross join lateral json_array_elements(t.info -> 'data' -> 'results') x(elt)
    where x.elt ->> 'Customer_ID' = 1
    

    请注意,您不需要将客户 ID 转换为 int,因为它已经以正确的格式存储在 json 数组中。

    【讨论】:

    • 再次感谢您的帮助@GMB 实际上,当您未将强制转换声明为 int 时,您会收到此错误:错误:运算符不存在:文本 = 整数提示:没有运算符与给定的匹配名称和参数类型。您可能需要添加显式类型转换。这对我有用:select x.elt ->> 'price' price from mytable t cross join lateral json_array_elements(t.info -> 'data' -> 'results') x(elt) where (*x.elt ->> 'Customer_ID')::int = 1
    猜你喜欢
    • 2020-08-17
    • 2017-05-04
    • 2021-11-03
    • 1970-01-01
    • 2018-06-11
    • 2019-03-13
    • 2015-11-12
    • 2017-10-10
    • 2014-03-02
    相关资源
    最近更新 更多