【问题标题】:Iterate an array using only select query in teradata在 teradata 中仅使用选择查询来迭代数组
【发布时间】:2021-08-15 22:13:46
【问题描述】:

我正在尝试使用输入表来实现输出表。输入表包含 id 和 name,其中 id 包含数值,name 包含 JSON 值。我可以通过使用 'LOOP'、'Cursor' 等编写过程查询来获得输出。但是我们如何在 Teradata 中使用 select 查询语句来实现这一点。

输入表

S.No Name
1 { "id": 4, "item" : ["Apple", "google", "IBM" ] }

输出表

Id Index Name
4 0 apple
4 1 google
4 2 ibm

查询

select * from json_table
(  
on 
  (
      select Name.jsonextractvalue("$.id.[*]) as memberid,
      Name
      from table_data 
  )
using rowexpr("$.name[*]"]
colexpr("")

) as A(member_id,index,name)

【问题讨论】:

  • 您的示例不是很有效的 JSON,但显然只有一个键,其对应的值是字符串数组。您可以将数组分解或提取为字符串值(例如,使用 JSON_TABLE 或 JSON_EXTRACT),甚至只是将整个字段转换为字符串。然后将 STRTOK_SPLIT_TO_TABLE 或 REGEXP_SPLIT_TO_TABLE 应用于该结果以“迭代”,即分成多行。
  • 我认为 json_table 至少不能与无效的 json 一起使用。至少你需要引用标识符 - "id" : ["apple"...
  • 请用我试过的查询找到更新后的问题。

标签: sql select teradata


【解决方案1】:

使用 JSONExtractValue / JSONExtract

WITH T AS (
SELECT CAST(name.JSONExtractValue('$.id') AS INTEGER) AS id,
  CAST(name.JSONExtract('$.item[*]') AS VARCHAR(4096)) AS itemlist
FROM  table_data
)
SELECT id, token_ndx-1 AS "Index", Name 
FROM TABLE(REGEXP_SPLIT_TO_TABLE(
T.id,
SUBSTRING(T.itemlist FROM 3 FOR LENGTH(T.itemlist)-4), /* remove [" and "] */
'","',  /* split at "," sequences */
'c') 
RETURNS(id INTEGER, token_ndx INTEGER, Name VARCHAR(100))) AS split;

或者使用 JSON_Table:

WITH T AS (
  SELECT id, itemlist
  FROM JSON_Table
    (ON (SELECT "S.id" AS Dummy, Name FROM table_data)
     USING ROWEXPR('$')
     COLEXPR('[ {"jsonpath" : "$.id", "type" : "INTEGER"},
                {"jsonpath" : "$.item", "type" : "VARCHAR(4096)"}
              ]')
    ) AS jt(Dummy, id, itemlist)
)
SELECT id, token_ndx-1 AS "Index", Name 
FROM TABLE(REGEXP_SPLIT_TO_TABLE(
 T.id,
 SUBSTRING(T.itemlist FROM 3 FOR LENGTH(T.itemlist)-4), /* remove [" and "] */
 '","', /* split at "," sequences */
 'c')
RETURNS(id INTEGER, token_ndx INTEGER, Name VARCHAR(100))) AS split;

【讨论】:

  • 使用第二部分我能够获取记录,我不得不在这些列上使用 group by 来删除重复项.. 但不知道为什么我们会为每一行获取重复记录,它返回 2记录,即在上面的示例中,我得到了 6 条记录而不是 3 条。你能解释一下原因吗
  • 不知道。这两种方法都适用于我,将给定的示例表 JSON 作为输入。还测试了源表中的多行。我没有得到任何重复。
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多