python - PostgreSQL JSON - 嵌套列表的子集
问题描述
我在 PostgreSQL 数据库中有一个列,它基本上是一个 jsonified 的 python 元组列表:
[
["Mobile","111-111-1111"],
["Office","222-222-2222"],
["Mobile","333-333-3333"],
["Fax","444-444-4444"],
]
我想构造一个查询,该查询根据每个嵌套列表中的第一个值返回列表的子集。下面是一个伪查询,希望能说明我所追求的:
SELECT
foo AS bar,
(SELECT
element
FROM
phone_numbers
WHERE
element::json->>0 = "Mobile") AS mobile_numbers
FROM
db
;
mobile_numbers == [["Mobile","111-111-1111"],["Mobile","333-333-3333"]]
我只知道关于 PostgreSQL 中的 json 运算符(以及一般的 SQL 查询)的点点滴滴,主要是在字典方面。我可以在这里找到很多关于如何挖掘嵌套字典并返回一个值的示例,但我还没有找到任何与我所追求的完全匹配的东西。
谢谢你的帮助。
解决方案
假设该列包含有效的 json 作为数组的数组,您应该使用 取消嵌套外部数组jsonb_array_elements()
,通过第一个(索引 0)它们的元素过滤内部数组(元组)并使用聚合结果jsonb_agg().
with my_table(phone_numbers) as (
values
('[
["Mobile","111-111-1111"],
["Office","222-222-2222"],
["Mobile","333-333-3333"],
["Fax","444-444-4444"]
]'::jsonb)
)
select jsonb_agg(phone)
from my_table
cross join jsonb_array_elements(phone_numbers) as arr(phone)
where phone->>0 = 'Mobile'
jsonb_agg
----------------------------------------------------------
[["Mobile", "111-111-1111"], ["Mobile", "333-333-3333"]]
(1 row)
推荐阅读
- version - 如何获取模块的版本
- eclipse-che - eclipse che 如何备份运行工作区?
- swift - 我的故事板与屏幕没有边对边
- sql - 计算 SQL (Access) 中多列的行差异
- mobile-safari - 使用 wavesurfer.js,如何在加载波形后创建 AudioContext?
- c - sizeof() & strlen() 隐含空字符
- java - java中的字符串池,编译时与运行时字符串评估
- html - 如何从我的 Facebook 直播中检索评论并作为 OBS 源导入?
- mongodb - 无法使用 express.js 中的 put 请求更新数据库
- sql-server - 如何动态查找和替换函数文本