Teradata 17使用JSON_TABLE拆解JSON数值数组并关联产品数据
问题原因
你遇到的prices数组解析返回NULL、序号全为1的问题,由两个错误导致:
- 解析标量类型的JSON数组元素时,不能直接用
$作为jsonpath取值,需要指定取标量值的专用路径 - 两次JSON_TABLE调用的ordinal生成规则不一致,后续关联也会出错
修复后的Prices拆解代码
正确的prices数组拆解写法如下:
SELECT * FROM JSON_Table ( ON (SELECT id, doc FROM test) USING rowexpr('$.prices[*]') colexpr('[ {"jsonpath" : "$value", "type" : "INTEGER"}, {"ordinal" : true, "start" : 0} ]') ) AS JT(id, price, ord) ;
这里的修改点:
- 将取值的jsonpath改为
$value,专门用于提取JSON标量(数字、字符串、布尔值)的实际值,避免JSON对象转数值类型时返回NULL - 给ordinal配置
"start" : 0,和products拆解返回的序号起始值保持一致,方便后续关联匹配
更高效的一次性实现方案
不需要拆分两次再关联,直接通过JSON路径的下标绑定,一次查询即可得到最终结果,性能更优:
SELECT * FROM JSON_Table ( ON (SELECT id, doc FROM test) USING rowexpr('$.products[*]') colexpr('[ {"jsonpath" : "$.category", "type" : "CHAR(20)"}, {"jsonpath" : "$.name", "type" : "VARCHAR(20)"}, {"jsonpath" : "$.prices[ordinal()]", "type" : "INTEGER"}, {"ordinal" : true, "start" : 0} ]') ) AS JT(id, category, name, price, ord) ;
这里直接通过ordinal()获取当前products元素的下标,对应取prices数组同下标的值,不需要额外的JOIN操作,也避免了两次解析JSON的开销。
关于UNPIVOT方案
不推荐使用UNPIVOT实现该需求:
- 数组长度不固定时,无法提前确定UNPIVOT需要的列数,兼容性极差
- 长数组场景下生成宽表的内存开销和计算开销远高于JSON_TABLE直接拆解的方案
内容的提问来源于stack exchange,提问作者Kota Mori
相关产品推荐
相关产品推荐

