teradata:JSON_TABLE 粉碎数字数组

teradata: JSON_TABLE to shred array of numbers

在 Teradata 数据库 (ver.17) 上,我想粉碎一个 JSON 对象,如下所示:

{
  "products": [{"category":"car", "name":"toyota"},
               {"category":"aircraft", "name":"boeing"},
               {"category":"fruit","name":"pear"}],
  "prices": [500, 100000, 1]
}

这里,productsprices数组配对;丰田的价格是500,波音是100000,梨是1。 我的目标是将其解析为以下形式:

id  category    name   price
----------------------------
 1       car  toyota     500
 1  aircraft  boeing  100000
 1     fruit    pear       1 

我的做法是用JSON_TABLE分别解析products和prices数组,然后join。

我可以使用 JSON_TABLE 函数切碎产品部分,但我被价格部分卡住了。

我目前的情况如下:

/* create temp table for demo */
CREATE MULTISET VOLATILE TABLE test AS (
SELECT 1 AS id, NEW JSON('{
  "products":[{"category":"car","name":"toyota"},
              {"category":"aircraft","name":"boeing"},
              {"category":"fruit","name":"pear"}],
  "prices":[500,100000,1]}') AS doc
)
WITH DATA
ON COMMIT PRESERVE ROWS
;

/* working shredding for products part */
SELECT * FROM JSON_Table (
  ON (SELECT id, doc FROM test)
  USING rowexpr('$.products[*]')
        colexpr('[ {"jsonpath" : "$.category", "type" : "CHAR(20)"},
                   {"jsonpath" : "$.name", "type" : "VARCHAR(20)"},
                   {"ordinal" : true} ]')
) AS JT(id, category, name, ord)
;

/* failing for prices parts, just get NULLs */
SELECT * FROM JSON_Table (
  ON (SELECT id, doc FROM test)
  USING rowexpr('$.prices[*]')
        colexpr('[ {"jsonpath" : "$", "type" : "INTEGER"},
                   {"ordinal" : true} ]')
) AS JT(id, price, ord)
;

结果如下。价格部分的输出不是预期的。

+----+------------------------------------------+--------+-----+
| id |                 category                 |  name  | ord |
+----+------------------------------------------+--------+-----+
| 1  | car                                      | toyota |  0  |
| 1  | aircraft                                 | boeing |  1  |
| 1  | fruit                                    |  pear  |  2  |
+----+------------------------------------------+--------+-----+


+----+-------+-----+
| id | price | ord |
+----+-------+-----+
| 1  |  None |  1  |
| 1  |  None |  1  |
| 1  |  None |  1  |
+----+-------+-----+

有人可以建议我如何切碎 JSON 的价格部分,最好使用 JSON_TABLE 吗?

实现相同目标的其他方法也将受到赞赏。

我想 UNPIVOT 语法可以工作,但我认为它效率不高,因为实际上我有更长的序列并且 UNPIVOT 需要我先做一个非常宽的 table (我可能是错的)。但是,如果 UNPIVOT 实际上是解决我的问题的好方法,请也让我知道。

我不知道 JSON_Table 是否可以用于拆分值数组,但结果看起来很奇怪:ord 总是 1 而不是 0,1,2。

JSON_Shread 按预期工作:

SELECT * 
FROM TD_JSONSHRED(
ON
 (
   SELECT id, doc
   FROM test
 )
USING
   ROWEXPR('prices')
   COLEXPR('')
   RETURNTYPES('INTEGER')
) dt
;

但是没有返回序号。

这个returns预期的结果:

WITH cte AS 
 (
   SELECT id
     ,doc.prices[*] AS prices
   FROM test
 )
SELECT id, ord, trycast(token AS INTEGER) 
FROM TABLE
 ( STRTOK_SPLIT_TO_TABLE (cte.id, cte.prices, '[],')
   RETURNS (id integer, ord integer, token varchar(20)) 
 ) AS d
;