You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中使用SQL+jsonb查询从无序JSON数组提取员工工作电话号码

可以!用PostgreSQL jsonb查询完全能实现这个需求

当然没问题,PostgreSQL的jsonb类型提供了非常灵活的数组展开和筛选能力,不需要额外工具就能精准提取你要的数据。

具体SQL语句

直接用嵌套的jsonb_array_elements展开嵌套数组,再筛选工作电话即可:

SELECT
  worker->>'name' AS employee_name,
  phone->>'number' AS work_phone
FROM
  contacts,
  jsonb_array_elements(json->'workers') AS worker,
  jsonb_array_elements(worker->'phones') AS phone
WHERE
  phone->>'type' = 'WORK';

语句解释

  1. 展开workers数组:jsonb_array_elements(json->'workers') AS worker 把每条contacts记录里的workers数组拆分成单独的行,每一行对应一个员工对象;
  2. 展开phones数组:jsonb_array_elements(worker->'phones') AS phone 接着把每个员工的phones数组也拆分成单独的行,每一行对应一个电话号码对象;
  3. 筛选工作电话:WHERE phone->>'type' = 'WORK' 只保留类型为WORK的电话号码记录;
  4. 提取字段:worker->>'name' 和 phone->>'number' 分别取出员工姓名和工作电话号码(->>操作符用于提取json字段的文本值)。

处理特殊情况(可选)

如果存在同一个员工有多个工作电话的场景,你可以加上DISTINCT来避免重复记录:

SELECT DISTINCT
  worker->>'name' AS employee_name,
  phone->>'number' AS work_phone
FROM
  contacts,
  jsonb_array_elements(json->'workers') AS worker,
  jsonb_array_elements(worker->'phones') AS phone
WHERE
  phone->>'type' = 'WORK';

用你提供的测试数据运行上面的SQL,会得到完全符合需求的结果:

employee_namework_phone
Alex916100203
Maria915532355
Nina915532321

内容的提问来源于stack exchange,提问作者kostin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:24:05