ORACLE SQL从XML中选择值

时间:2018-05-21 14:23:40

标签: sql xml oracle

如何在ORACLE SQL中从XML中选择值?

我们假设我在表格中有两个XML" item":

第一行和第二列" intreevalue"数据

<change xmlns="http://do.it.com/ch/PLP">
  <header>
    <op>XDD</op>
  </header>
  <id>10565</id>
</change>

和 第二行和第二列&#34; intreevalue&#34;数据

<deactivate xmlns="http://mrlo.com/nnu/XCBouIK">
  <header>
    <op>XDG</id>
  </header>
  <id>67544</id>
</deactivate>

我知道&#34; EXTRACTVALUE&#34;被诽谤。我需要价值观&#34; op&#34;和&#34; id&#34;在一个选择。我想如果没有名称空间,例如&#39; xmlns =&#34; http://do.it.com/ch/PLP"&#39;这很容易。但我可以选择这样的数据(例如 - 我知道它可以工作,只是想说出我的意思)?

select "/*/header/op" op, "/*/id" id from .....

由于

1 个答案:

答案 0 :(得分:1)

我看到两个选项:

  1. 使用REGEXP_REPLACE()删除所有代码中的所有xmlns属性。

    SELECT EXTRACT(XMLTYPE(REGEXP_REPLACE(items.intreevalue,
                                          '(<[^>]+[[:space:]]+)xmlns(?::[^[:space:]=]+)?[:space:]*=[:space:]*"[^"]*"',
                                          '\1')),
                   '/*/header/op/text()')
           .GETSTRINGVAL() op,
           EXTRACT(XMLTYPE(REGEXP_REPLACE(items.intreevalue,
                                          '(<[^>]+[[:space:]]+)xmlns(?::[^[:space:]=]+)?[:space:]*=[:space:]*"[^"]*"',
                                          '\1')),
                   '/*/id/text()')
           .GETNUMBERVAL() id
           FROM items;
    

    但如果您确实需要以不同方式处理来自不同名称空间的某些元素,则可能会出现问题。也许你可以调整正则表达式,只删除&#34;有问题的&#34;命名空间属性但保留其他属性。

  2. 使用较大的CASE ... END检查每个可能的命名空间,并获取第一个(不是NULL)结果。

    SELECT CASE
             WHEN EXTRACT(items.intreevalue,
                          '/*/header/op/text()',
                          'xmlns="http://do.it.com/ch/PLP"')
                  .GETSTRINGVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/header/op/text()',
                            'xmlns="http://do.it.com/ch/PLP"')
                    .GETSTRINGVAL()
             WHEN EXTRACT(items.intreevalue,
                          '/*/header/op/text()',
                          'xmlns="http://mrlo.com/nnu/XCBouIK"')
                  .GETSTRINGVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/header/op/text()',
                            'xmlns="http://mrlo.com/nnu/XCBouIK"')
                    .GETSTRINGVAL()
           END op,
           CASE
             WHEN EXTRACT(items.intreevalue,
                          '/*/id/text()',
                          'xmlns="http://do.it.com/ch/PLP"')
                  .GETNUMBERVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/id/text()',
                            'xmlns="http://do.it.com/ch/PLP"')
                    .GETNUMBERVAL()
             WHEN EXTRACT(items.intreevalue,
                          '/*/id/text()',
                          'xmlns="http://mrlo.com/nnu/XCBouIK"')
                  .GETNUMBERVAL() IS NOT NULL
               THEN EXTRACT(items.intreevalue,
                            '/*/id/text()',
                            'xmlns="http://mrlo.com/nnu/XCBouIK"')
                    .GETNUMBERVAL()
           END id
           FROM items;
    

    如果案例中没有包含名称空间,您仍然可以获得相应XML的NULL个。