【问题标题】:How to extract repeatable json node values separately from XML using ORACLE SQL?如何使用 ORACLE SQL 从 XML 中分别提取可重复的 json 节点值?
【发布时间】:2017-07-19 10:29:40
【问题描述】:

我有以下 XML,我想提取 json 参数“serviceNumber”的值单独我尝试使用 EXTRACT 函数,但我得到了连接的结果,但我希望它们分开。

<Input>
   <Header>
      <User-Agent></User-Agent>
      <Accepted-Language></Accepted-Language>
      <Authorization></Authorization>
      <Date>Mon, 27 Feb 2017 21:39:55 GMT</Date>
      <Username></Username>
      <Test />
      <UserInfo />
      <msisdn />
      <imsi />
      <X-Forwarded-For></X-Forwarded-For>
      <x-Client-IP></x-Client-IP>
      <Location />
   </Header>
   <URI></URI>
   <ServiceName></ServiceName>
   <PrimaryKey></PrimaryKey>
   <Parameters>
      <Parameter1></Parameter1>
      <Parameter2 />
      <Parameter3 />
   </Parameters>
   <Body>
      <json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd">
         <json:string name="transactionType"></json:string>
         <json:array name="payments">
            <json:object>
               <json:string name="amount"></json:string>
               <json:string name="serviceNumber">536888669</json:string>
               <json:string name="serviceType"></json:string>
               <json:string name="accountNumber"></json:string>
            </json:object>
            <json:object>
               <json:string name="amount"></json:string>
               <json:string name="serviceNumber">535394441</json:string>
               <json:string name="serviceType"></json:string>
               <json:string name="accountNumber"></json:string>
            </json:object>
            <json:object>
               <json:string name="amount"></json:string>
               <json:string name="serviceNumber">138422262</json:string>
               <json:string name="serviceType"></json:string>
               <json:string name="accountNumber"></json:string>
            </json:object>
            <json:object>
               <json:string name="amount"></json:string>
               <json:string name="serviceNumber">505809543</json:string>
               <json:string name="serviceType"></json:string>
               <json:string name="accountNumber"></json:string>
            </json:object>
            <json:object>
               <json:string name="amount"></json:string>
               <json:string name="serviceNumber">138422338</json:string>
               <json:string name="serviceType"></json:string>
               <json:string name="accountNumber"></json:string>
            </json:object>
         </json:array>
      </json:object>
   </Body>
</Input>

我想要这样的输出

serviceNumber
-------------
536888669
535394441
138422262
505809543
138422338

【问题讨论】:

  • JSON 嵌入在 XML 中,因为 XML 本身还不够粗糙 :)

标签: sql json xml oracle


【解决方案1】:

使用XMLTABLE:

SELECT x.serviceNumber
FROM   your_table t
       CROSS JOIN
       XMLTABLE(
         XMLNAMESPACE( 'http://www.yourserver.url/json/' AS "json" ),
         '//root/Input/Body/json:object/json:array/json:object/'
         PASSING XMLTYPE(
           '<?xml version="1.0" encoding="utf-8"?>' ||
           '<root xmlns:json="http://www.yourserver.url/json/">' ||
           t.your_xml_column ||
           '</root>'
         )
         COLUMNS serviceNumber NUMBER PATH './json:string[@name="serviceNumber"]'
       ) x

【讨论】:

    【解决方案2】:

    试试 XMLTABLE

    select * from xmltable(XMLNAMESPACES( 'http://www.ibm.com/xmlns/prod/2009/jsonx' as "json") , '//json:string[@name eq "serviceNumber"]' passing xmltype({your_xml_here})
     columns serviceNumber varchar2(100) path '.' 
     )
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2017-09-24
      • 2017-05-24
      • 2020-09-20
      • 1970-01-01
      • 2023-03-30
      • 2020-05-05
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多