向我们求助如何正确使用cte创建json对象的sql

y3bcpkx1  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(313)

请求的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:选择列表中的位置41列objheader或表达式无效。
我在问,这是否是创建这个sql语句的正确方法,有没有更好的方法?知道如何重写sql语句以使其正常工作吗?

nwsw7zdq

nwsw7zdq1#

生成json或xml的关键是从内部开始,然后解决问题。
(我将原始数据简化为一个测试表…)

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程序中。

相关问题