达梦数据库中JSON对象取值,如何获取?

7 阅读1分钟

JSON_VALUEJSON_UNQUOTE(JSON_EXTRACT()) 都是达梦(兼容 Oracle/MySQL)中提取 JSON 字段值的方式,核心功能一致(获取 JSON 属性的纯文本值) ,但语法来源、使用场景、兼容性有明显区别,具体如下:

维度JSON_VALUE(dpi.ci_mgmt_data, '$.des_pi_nm')JSON_UNQUOTE(JSON_EXTRACT(ci_mgmt_data, '$.service_id'))
语法来源Oracle 原生 JSON 函数(达梦兼容 Oracle 语法时支持)MySQL 原生 JSON 函数组合(达梦兼容 MySQL 语法时支持)
核心逻辑一步到位:直接提取 JSON 属性的无引号纯文本值两步组合:1. JSON_EXTRACT 提取带引号的值;2. JSON_UNQUOTE 去除引号
返回值类型纯文本字符串(无引号),和普通字符串字段类型一致纯文本字符串(无引号),结果和JSON_VALUE完全相同
兼容性1. 仅达梦COMPATIBLE_MODE=ORACLE时支持;2. Oracle 数据库原生支持1. 达梦COMPATIBLE_MODE=MYSQL/ORACLE都支持;2. MySQL 数据库原生支持
使用场景项目以 Oracle 语法为基准(比如你的蓝图详情查询)项目以 MySQL 语法为基准(比如你的 desired_ins_item 查询)
简化写法无简化形式,必须写完整函数达梦 / MySQL 支持简化为 ci_mgmt_data->>'$.service_id'
错误处理若 JSON 路径不存在 / 格式错误,返回NULL(无报错)若 JSON 路径不存在 / 格式错误,返回NULL(无报错)

实例验证 假设 ci_mgmt_data 字段值为:

{"des_pi_nm": "订单系统-生产环境", "service_id": "SVC001"}

写法1:JSON_VALUE(Oracle风格)

SELECT JSON_VALUE(ci_mgmt_data, '$.des_pi_nm') FROM desired_product_instance;- 返回:订单系统-生产环境(无引号)

写法2:JSON_UNQUOTE+JSON_EXTRACT(MySQL风格)

SELECT JSON_UNQUOTE(JSON_EXTRACT(ci_mgmt_data, '$.service_id')) FROM desired_ins_item; -- 返回:SVC001(无引号)