SQL兼容级别100无OPENJSON时提取JSON数组值转列方法
问题根因
之前调用JSON_Value(details, '$.name')返回null,核心原因有两点:
details列存储的是JSON数组结构,根节点不是单个JSON对象,直接使用$.name路径无法定位到属性,自然返回空值- 当前数据库兼容级别为100,不支持
OPENJSON()函数,无法通过常规JSON表值函数拆解数组后做行转列处理。
适配低兼容级别的实现方案
已知测试项为固定枚举值(rtc、battery、connection、timer、provide、request),无需动态解析未知字段,可直接通过字符串匹配提取对应测试结果,完全兼容100兼容级别,无需调整数据库配置。
假设原表名为product_test,可直接执行以下查询:
SELECT id, model, type, -- 提取rtc测试结果 CASE WHEN details LIKE '%"name":"rtc","value":"pass"%' THEN 'pass' WHEN details LIKE '%"name":"rtc","value":"fail"%' THEN 'fail' ELSE NULL END AS rtc, -- 提取battery测试结果 CASE WHEN details LIKE '%"name":"battery","value":"pass"%' THEN 'pass' WHEN details LIKE '%"name":"battery","value":"fail"%' THEN 'fail' ELSE NULL END AS battery, -- 提取connection测试结果 CASE WHEN details LIKE '%"name":"connection","value":"pass"%' THEN 'pass' WHEN details LIKE '%"name":"connection","value":"fail"%' THEN 'fail' ELSE NULL END AS connection, -- 提取timer测试结果 CASE WHEN details LIKE '%"name":"timer","value":"pass"%' THEN 'pass' WHEN details LIKE '%"name":"timer","value":"fail"%' THEN 'fail' ELSE NULL END AS timer, -- 提取provide测试结果 CASE WHEN details LIKE '%"name":"provide","value":"pass"%' THEN 'pass' WHEN details LIKE '%"name":"provide","value":"fail"%' THEN 'fail' ELSE NULL END AS provide, -- 提取request测试结果 CASE WHEN details LIKE '%"name":"request","value":"pass"%' THEN 'pass' WHEN details LIKE '%"name":"request","value":"fail"%' THEN 'fail' ELSE NULL END AS request FROM product_test;
适配调整说明
- 如果存储的JSON内容存在格式空格(如
"name": "rtc"这类key、冒号、值之间带空格的写法,或是存在换行、缩进排版),可调整LIKE匹配规则适配,例如将固定匹配串改为'%"name"%"rtc"%"value"%"pass"%',即可忽略中间的格式字符完成匹配,避免因JSON排版差异导致匹配失败。 - 若后续新增固定测试项,参照现有CASE WHEN模板新增对应列即可,无需修改其他逻辑
- 产品未覆盖的测试项对应列会返回NULL,天然适配“不同产品测试项数量不一致”的场景。
内容的提问来源于stack exchange,提问作者Emelia Johansson
相关产品推荐
相关产品推荐

