You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:18:00