向我们寻求帮助 SQL 使用 CTE 创建 JSON_OBJECT 的正确方法
Asking for help on correct way to us SQL with CTE to create JSON_OBJECT
请求的JSON需要采用这种形式:
{
"header": {
"InstanceName": "US"
},
"erpReferenceData": {
"erpReferences": [
{
"ServiceID": "fb16e421-792b-4e9c-935b-3cea04a84507",
"ERPReferenceID": "J0000755"
},
{
"ServiceID": "7d13d907-0932-44c0-ad81-600c9b97b6e5",
"ERPReferenceID": "J0000756"
}
]
}
}
我创建的程序如下所示:
dcl-s OutFile sqltype(dbclob_file);
exec sql
With x as (
select json_object(
'InstanceName' : trim(Cntry) ) objHeader
from xmlhdr
where cntry = 'US'),
y as (
select json_object(
'ServiceID' VALUE S.ServiceID,
'ERPReferenceID' VALUE I.RefCod) oOjRef
FROM IMH I
INNER JOIN GUIDS G ON G.REFCOD = I.REFCOD
INNER JOIN SERV S ON S.GUID = G.GUID
WHERE G.XMLTYPE = 'Service')
VALUES (
select json_object('header' : objHeader Format json ,
'erpReferenceData' : json_object(
'erpReferences' VALUE
JSON_ARRAYAGG(
ObjRef Format json)))
from x
LEFT OUTER JOIN y ON 1=1
Group by objHeader)
INTO :OutFile;
这是我得到的编译错误:
SQL0122: Position 41 Column OBJHEADER or expression in SELECT list not valid.
我想问这是否是创建此 SQL 语句的正确方法,是否有更好更简单的方法?知道如何重写 SQL 语句以使其正常工作吗?
产生 JSON 或 XML 的关键是从内部开始,逐步解决问题。
(我已将原始数据简化为测试 table...)
with elm as(select json_object
('ServiceID' VALUE ServiceID,
'ERPReferenceID' VALUE RefCod) as erpRef
from jsontst)
select * from elm;
现在添加下一层作为 CTE,在第一个 CTE 上构建..
with elm as(select json_object
('ServiceID' VALUE ServiceID,
'ERPReferenceID' VALUE RefCod) as erpRef
from jsontst)
, arr (arrDta) as (values json_array (select erpRef from elm))
select * from arr;
还有下一层...
with elm as(select json_object
('ServiceID' VALUE ServiceID,
'ERPReferenceID' VALUE RefCod) as erpRef
from jsontst)
, arr (arrDta) as (values json_array (select erpRef from elm))
, erpReferences (refs) as ( select json_object
('erpReferences' value arrDta )
from arr)
select *
from erpReferences;
使用 CTE 进行构建的好处在于每一步,您可以看到目前的结果...
实际上,您可以随时返回并在中间粘贴一个 Select * from CTE;
以查看您在某个时候拥有的内容。
请注意,我正在 运行 SQL 脚本中构建它。语句完成后,您可以将其嵌入到您的 RPG 程序中。
请求的JSON需要采用这种形式:
{
"header": {
"InstanceName": "US"
},
"erpReferenceData": {
"erpReferences": [
{
"ServiceID": "fb16e421-792b-4e9c-935b-3cea04a84507",
"ERPReferenceID": "J0000755"
},
{
"ServiceID": "7d13d907-0932-44c0-ad81-600c9b97b6e5",
"ERPReferenceID": "J0000756"
}
]
}
}
我创建的程序如下所示:
dcl-s OutFile sqltype(dbclob_file);
exec sql
With x as (
select json_object(
'InstanceName' : trim(Cntry) ) objHeader
from xmlhdr
where cntry = 'US'),
y as (
select json_object(
'ServiceID' VALUE S.ServiceID,
'ERPReferenceID' VALUE I.RefCod) oOjRef
FROM IMH I
INNER JOIN GUIDS G ON G.REFCOD = I.REFCOD
INNER JOIN SERV S ON S.GUID = G.GUID
WHERE G.XMLTYPE = 'Service')
VALUES (
select json_object('header' : objHeader Format json ,
'erpReferenceData' : json_object(
'erpReferences' VALUE
JSON_ARRAYAGG(
ObjRef Format json)))
from x
LEFT OUTER JOIN y ON 1=1
Group by objHeader)
INTO :OutFile;
这是我得到的编译错误:
SQL0122: Position 41 Column OBJHEADER or expression in SELECT list not valid.
我想问这是否是创建此 SQL 语句的正确方法,是否有更好更简单的方法?知道如何重写 SQL 语句以使其正常工作吗?
产生 JSON 或 XML 的关键是从内部开始,逐步解决问题。
(我已将原始数据简化为测试 table...)
with elm as(select json_object
('ServiceID' VALUE ServiceID,
'ERPReferenceID' VALUE RefCod) as erpRef
from jsontst)
select * from elm;
现在添加下一层作为 CTE,在第一个 CTE 上构建..
with elm as(select json_object
('ServiceID' VALUE ServiceID,
'ERPReferenceID' VALUE RefCod) as erpRef
from jsontst)
, arr (arrDta) as (values json_array (select erpRef from elm))
select * from arr;
还有下一层...
with elm as(select json_object
('ServiceID' VALUE ServiceID,
'ERPReferenceID' VALUE RefCod) as erpRef
from jsontst)
, arr (arrDta) as (values json_array (select erpRef from elm))
, erpReferences (refs) as ( select json_object
('erpReferences' value arrDta )
from arr)
select *
from erpReferences;
使用 CTE 进行构建的好处在于每一步,您可以看到目前的结果...
实际上,您可以随时返回并在中间粘贴一个 Select * from CTE;
以查看您在某个时候拥有的内容。
请注意,我正在 运行 SQL 脚本中构建它。语句完成后,您可以将其嵌入到您的 RPG 程序中。