前置知识: PostgreSQL

JSON-TABLE

1 minAdvanced2026/6/14

PostgreSQL JSON_TABLE:标准化JSON处理、路径表达式、嵌套列与关系化输出

1. JSON_TABLE 概述

JSON_TABLE 是 SQL:2016 标准函数,将 JSON 数据转换为关系表,PostgreSQL 17+ 支持。

2. 基本用法

-- 将 JSON 数组展开为行
SELECT jt.*
FROM api_logs,
JSON_TABLE(payload, '$.items[*]' COLUMNS (
    product_id INTEGER PATH '$.product_id',
    quantity INTEGER PATH '$.quantity',
    price NUMERIC PATH '$.price'
)) AS jt;

3. 嵌套列

-- 处理嵌套 JSON
SELECT jt.name, addr.street, addr.city
FROM users,
JSON_TABLE(data, '$' COLUMNS (
    name VARCHAR(100) PATH '$.name',
    NESTED PATH '$.address' COLUMNS (
        street VARCHAR(200) PATH '$.street',
        city VARCHAR(100) PATH '$.city',
        zip VARCHAR(20) PATH '$.zip'
    )
)) AS jt;

4. 错误处理

-- ERROR ON ERROR:遇到错误报错
-- EMPTY ON ERROR:遇到错误返回空
-- NULL ON ERROR:遇到错误返回 NULL(默认)

SELECT jt.*
FROM documents,
JSON_TABLE(data, '$.items[*]' COLUMNS (
    id INTEGER PATH '$.id' ERROR ON ERROR,
    name VARCHAR(100) PATH '$.name' NULL ON ERROR
)) AS jt;

5. 与 JSONB 操作符对比

-- JSONB 操作符方式
SELECT payload->>'name' AS name,
       payload->'address'->>'city' AS city
FROM users;

-- JSON_TABLE 方式(更适合复杂嵌套)
SELECT jt.name, jt.city
FROM users,
JSON_TABLE(payload, '$' COLUMNS (
    name VARCHAR(100) PATH '$.name',
    city VARCHAR(100) PATH '$.address.city'
)) AS jt;