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

PostgreSQL中如何查询表列与JSON数组元素同行展示

问题需求

我有一张employees.employee_data表,表中每条记录包含emp_id(员工ID)和associations(JSONB类型字段,内部包含group_tags数组,数组元素是含orgId、locationId的对象)。需要编写SELECT语句,将每个员工ID与group_tags数组的每个元素展开为单独行,输出结果每行包含emp_id、orgId、locationId三个字段。

表结构及测试数据脚本
CREATE TABLE employees.employee_data (
    emp_id              varchar(50)  PRIMARY KEY,
    associations        JSONB NOT NULL default '{}'::jsonb
);

INSERT INTO employees.employee_data
(emp_id, associations)
VALUES('1001', '{
                              "group_tags": [
                                {
                                  "orgId": "XYZCompany",
                                  "locationId": "Location01"
                                },
                                {
                                  "orgId": "XYZCompany",
                                  "locationId": "Location02"
                                }                               
                              ]
                            }'::jsonb);
                            

INSERT INTO employees.employee_data
(emp_id, associations)
VALUES('1002', '{
                              "group_tags": [
                                {
                                  "orgId": "ABCCompany",
                                  "locationId": "Location03"
                                },
                                {
                                  "orgId": "ABCCompany",
                                  "locationId": "Location04"
                                }                               
                              ]
                            }'::jsonb);
解决方案

利用PostgreSQL的jsonb_array_elements函数拆分JSONB数组,配合->>操作符提取对象字段值,SQL语句如下:

SELECT 
    emp_id,
    (tag->>'orgId') AS org_id,
    (tag->>'locationId') AS location_id
FROM 
    employees.employee_data,
    jsonb_array_elements(associations->'group_tags') AS tag;

说明

  • jsonb_array_elements(associations->'group_tags') AS tag:把associations字段内的group_tags数组拆分为多行,每行对应数组中的一个对象,用tag作为该对象的别名。
  • tag->>'orgId':从拆分出的tag对象中提取orgId的字符串值,作为org_id列;同理提取locationId作为location_id列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:57:16