0

在 SQL 中,我需要创建如下所示的 xml 代码:

    <Phone>
       <PhoneTypeCode tc="12">Mobile</PhoneTypeCode>
       <Area>801</Area>
       <DialNumber>9996666</DialNumber>
    </Phone>
    <Phone>
       <PhoneTypeCode tc="2">Business</PhoneTypeCode>
       <Area>801</Area>
       <DialNumber>1113333</DialNumber>
    </Phone>

使用 xmlagg,但它在 p.desc 之后的“,”上引发错误

这个 IBM DB2 SQL 函数需要如何修复才能实现上面的 xml?

    select  
      xmlelement(Name "Phone", 
        xmlagg(xmlelement(name "PhoneTypeCode", 
               xmlattributes(trim(p.phtype) as "tc"), trim(p.desc)),
           xmlelement(name "AreaCode", p.area),
           xmlelement(name "DialNumber", p.phone)
            )                   
      ) as xml
    from phone p
    where p.entityid = #entity_id 

我还想补充一点,它确实可以这样编译和运行:

    select  
      xmlelement(Name "Phone", 
        xmlagg(xmlelement(name "PhoneTypeCode", 
               xmlattributes(trim(p.phtype) as "tc"), trim(p.desc))
        )                   
      ) as xml
    from phone p
    where p.entityid = #entity_id 

这是它返回的内容:

    <Phone>
       <PhoneTypeCode tc="12">Mobile</PhoneTypeCode>
       <PhoneTypeCode tc="2">Business</PhoneTypeCode>
    </Phone>

但当然,我需要 Area 和 DialNumber。就好像你在一个 xmlagg 中不能有多个 xmlelement。

4

1 回答 1

0

这个 IBM DB2 SQL 函数需要如何修复才能实现上面的 xml?

首先,您可能想要计算括号。通常,人们需要与左括号一样多的右括号。

其次,您根本不需要 XMLAGG()。当基于多个关系记录将多个相同类型的元素插入单个外部元素时,您会使用它,例如

 <phones>
   <phone no="1" .../>
   <phone no="2" .../>
   ...
 </phones>

对你来说,这样的事情应该有效:

  with phone (phtype, desc, area, phone) as 
     (values ('home','blah','555','555-5555'),('office','blah','555','555-1111'))
  select  
    xmlelement(
      Name "Phone", 
      xmlelement(
        name "PhoneTypeCode", 
        xmlattributes(
           trim(p.phtype) as "tc"
        ), 
        trim(p.desc)
      ),
      xmlelement(name "AreaCode", p.area),
      xmlelement(name "DialNumber", p.phone)                   
    ) as xml
  from phone p
于 2013-05-23T18:24:46.510 回答