向我们寻求帮助 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 程序中。