sql - 从 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 我基本上得到了数组的两个元素而不是一个。我不知道我做错了什么
解决方案
您可以使用横向连接来取消嵌套数组元素,然后使用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 数组中。
推荐阅读
- c# - 适用于 MS Teams 的 C# Bot Framework - 如何将临时主动消息作为新对话发送
- firebase - Firebase 规则使 sha1
- python-3.x - 当使用 Python/NLU 对结构化数据框进行查询时,如何提取有意义的提取?
- jenkins - 无法安装 Jenkins Slave - 作为服务
- html - 使用 JSTL 时,li 标签中的类保持分离
- javascript - Gravity Forms JS 在 AJAX 提交失败时被删除
- javascript - 使用javascript插入跨度环绕链接文本
- ruby-on-rails - rake db:mysql2 gem 的迁移错误 - 未加载库:libssl.1.0.0.dylib
- reactjs - 设置与技术无关的原子设计工作流程
- shell - stty:标准输入:设备的 ioctl 不合适。从 shell 脚本运行 Perl 脚本