JSON_VALUE 和 JSON_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(无引号)