当前位置: 首页 > news >正文

达梦数据库JSON_TABLE使用说明

在达梦数据库(DM Database)中,将 JSON 数据转换为表格形式可以使用内置的 JSON_TABLE 函数。以下是详细步骤和示例:


1. 核心函数:JSON_TABLE

JSON_TABLE 用于将 JSON 数据解析为关系表结构,支持从 JSON 对象或数组中提取数据。

语法:
SELECT *
FROM JSON_TABLE(json_doc,         -- JSON 字符串或 JSON 列path              -- JSON 路径(指定要解析的部分)COLUMNS (列名1 数据类型 PATH '字段路径1' [ERROR | NULL ON ERROR],列名2 数据类型 PATH '字段路径2' [TRIM | DEFAULT 默认值 ON EMPTY],... )
) AS 别名;

2. 示例演示

示例 1:解析 JSON 数组

假设 JSON 数据如下:

[{"id": 1, "name": "Alice", "age": 25},{"id": 2, "name": "Bob", "age": 30}
]

查询语句:

SELECT *
FROM JSON_TABLE('[{"id":1,"name":"Alice","age":25},{"id":2,"name":"Bob","age":30}]','$[*]'  -- 解析根数组的所有元素COLUMNS (id INT PATH '$.id',name VARCHAR(50) PATH '$.name',age INT PATH '$.age')
) AS jt;

结果:

IDNAMEAGE
1Alice25
2Bob30

示例 2:解析嵌套 JSON

假设 JSON 数据:

{"dept": "IT","employees": [{"id": 101, "name": "Tom"},{"id": 102, "name": "Jerry"}]
}

查询语句:

SELECT *
FROM JSON_TABLE('{"dept":"IT","employees":[{"id":101,"name":"Tom"},{"id":102,"name":"Jerry"}]}','$.employees[*]'  -- 解析 employees 数组COLUMNS (dept VARCHAR(10) PATH '$.dept',  -- 注意:此处需用根路径id INT PATH '$.id',name VARCHAR(50) PATH '$.name')
) AS jt;

修复路径后的正确写法:

SELECT jt.*,JSON_VALUE(原JSON字段, '$.dept') AS dept  -- 额外提取部门
FROM JSON_TABLE('{"dept":"IT","employees":[{"id":101,"name":"Tom"},{"id":102,"name":"Jerry"}]}','$.employees[*]'COLUMNS (id INT PATH '$.id',name VARCHAR(50) PATH '$.name')
) AS jt;

3. 处理空值/错误

  • NULL ON EMPTY:路径不存在时返回 NULL
  • DEFAULT 值 ON EMPTY:路径不存在时返回默认值
  • ERROR ON ERROR:转换错误时报错(默认行为)
示例:
SELECT *
FROM JSON_TABLE('[{"id":1,"score":"90"},{"id":2}]','$[*]'COLUMNS (id INT PATH '$.id',score INT PATH '$.score' DEFAULT -1 ON EMPTY  -- 缺失时返回 -1)
) AS jt;

结果:

IDSCORE
190
2-1

4. 从表中读取 JSON 列

若 JSON 数据存储在表的列中(如 user_data JSON):

SELECT jt.*
FROM your_table,
JSON_TABLE(your_table.json_column,  -- 直接引用 JSON 列'$.employees[*]'COLUMNS (id INT PATH '$.id',name VARCHAR(100) PATH '$.name')
) AS jt;

5. 复杂路径处理

解析多层嵌套 JSON:
{"project": "X","tasks": [{"task_id": 1,"details": {"owner": "Amy", "priority": "high"}}]
}

查询:

SELECT *
FROM JSON_TABLE('{"project":"X","tasks":[{"task_id":1,"details":{"owner":"Amy","priority":"high"}}]}','$.tasks[*]'COLUMNS (project VARCHAR(10) PATH '$.project',task_id INT PATH '$.task_id',owner VARCHAR(20) PATH '$.details.owner',priority VARCHAR(10) PATH '$.details.priority')
) AS jt;

注意事项:

  1. 路径语法:使用 $ 表示根,. 访问属性,[*] 遍历数组。
  2. 版本兼容:确保达梦数据库版本支持 JSON_TABLE(DM 8.0 及以上通常支持)。
  3. 性能:处理大 JSON 时注意性能,避免全表扫描。

通过以上方法,可灵活地将 JSON 数据转换为表格结构,便于 SQL 查询和分析。

http://www.dtcms.com/a/290689.html

相关文章:

  • grpc: debug: GRPC_TRACE
  • ESP32开发——基于idf框架使用NVS操作存储设备读写
  • 家庭服务具身智能机器人体系架构
  • 一次 POI 版本升级踩坑记录
  • lesson20:Python函数的标注
  • docker nginx 部署前端踩坑记录
  • WinUI3开发_Frame用法
  • MYSQL:数据库约束
  • 【PTA数据结构 | C语言版】拓扑排序
  • 通信刚需小能手,devicenet转PROFINET网关兼容物流分拣自动化
  • 自动化计算机经过加固后有什么好处?
  • OpenAI API(2) OpenAI Responses API使用
  • 设备管理系统(MMS)如何在工厂MOM功能设计和系统落地
  • 深入解析 Linux 硬链接与软链接:原理、区别及应用场景
  • 龙虎榜——20250721
  • Linux中ELF区域与文件偏移量的关系
  • 【AI论文】EXAONE 4.0:融合非推理模式与推理模式的统一大语言模型
  • Neovim 安装与解压 tar.gz 文件
  • AXI接口学习
  • Python 模块未找到?这样解决“ModuleNotFoundError”
  • Dev C++下载安装和使用教程(图文并茂,保姆级教程)
  • dolphinscheduler中sqoop无法执行
  • 机器人工程专业本科阶段的学习分析(腾讯元宝)
  • Real-World Blur Dataset for Learning and Benchmarking Deblurring Algorithms
  • 系统分析师-计算机系统-操作系统-存储器管理设备管理
  • Oracle From查看弹性域设置
  • (3)Oracle基本语法与常用函数
  • Oracle自治事务——从问题到实践的深度解析
  • 基于MySQL实现分布式调度系统的选举算法
  • CLIP与SIGLIP对比浅析