在 teradata 中仅使用 select 查询迭代数组
Iterate an array using only select query in teradata
我正在尝试使用输入 table 实现输出 table。输入 table 包含 id 和 name,其中 id 具有数值,name 包含 JSON 值。我可以通过使用 'LOOP'、'Cursor' 等编写过程查询来获得输出。但是我们如何在 Teradata 中使用 select 查询语句来实现同样的结果。
输入table
S.No
Name
1
{ "id": 4, "item" : ["Apple", "google", "IBM" ] }
输出table
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)
使用 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;
我正在尝试使用输入 table 实现输出 table。输入 table 包含 id 和 name,其中 id 具有数值,name 包含 JSON 值。我可以通过使用 'LOOP'、'Cursor' 等编写过程查询来获得输出。但是我们如何在 Teradata 中使用 select 查询语句来实现同样的结果。
输入table
S.No | Name |
---|---|
1 | { "id": 4, "item" : ["Apple", "google", "IBM" ] } |
输出table
Id | Index | Name |
---|---|---|
4 | 0 | apple |
4 | 1 | |
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)
使用 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;