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]
}
这里,products
和prices
数组配对;丰田的价格是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
;
在 Teradata 数据库 (ver.17) 上,我想粉碎一个 JSON 对象,如下所示:
{
"products": [{"category":"car", "name":"toyota"},
{"category":"aircraft", "name":"boeing"},
{"category":"fruit","name":"pear"}],
"prices": [500, 100000, 1]
}
这里,products
和prices
数组配对;丰田的价格是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
;