首页 > 解决方案 > 从 JSON 数组中选择唯一值 - PostgreSQL JSON 列

问题描述

我在 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 我基本上得到了数组的两个元素而不是一个。我不知道我做错了什么

标签: sqlarraysjsonpostgresqlselect

解决方案


您可以使用横向连接来取消嵌套数组元素,然后使用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 数组中。


推荐阅读