首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >teradata:分解数字数组的JSON_TABLE

teradata:分解数字数组的JSON_TABLE
EN

Stack Overflow用户
提问于 2021-09-15 20:05:21
回答 1查看 106关注 0票数 0

在Teradata数据库(版本17)上,我想分解一个JSON对象,如下所示:

代码语言:javascript
复制
{
  "products": [{"category":"car", "name":"toyota"},
               {"category":"aircraft", "name":"boeing"},
               {"category":"fruit","name":"pear"}],
  "prices": [500, 100000, 1]
}

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

代码语言:javascript
复制
id  category    name   price
----------------------------
 1       car  toyota     500
 1  aircraft  boeing  100000
 1     fruit    pear       1 

我的方法是使用JSON_TABLE分别解析产品和价格数组,然后连接。

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

到目前为止,我得到的信息如下:

代码语言:javascript
复制
/* 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)
;

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

代码语言:javascript
复制
+----+------------------------------------------+--------+-----+
| 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要求我首先制作一个非常宽的表(我可能是错的)。但是,如果UNPIVOT确实是我的问题的一个很好的解决方案,请让我知道这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-16 22:33:02

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

JSON_Shread的工作方式与预期一致:

代码语言:javascript
复制
SELECT * 
FROM TD_JSONSHRED(
ON
 (
   SELECT id, doc
   FROM test
 )
USING
   ROWEXPR('prices')
   COLEXPR('')
   RETURNTYPES('INTEGER')
) dt
;

但是没有返回序数。

这将返回预期的结果:

代码语言:javascript
复制
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
;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69199176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档