繁体   English   中英

Oracle XMLTABLE 和 XPATH

[英]Oracle XMLTABLE and XPATH

我对 Xpath 有点迷茫,我正在尝试从 XML 获取属性,我目前正在使用:

XMLTABLE('/attrs/attr[@name="ImagesWEB"]/string'
    PASSING XMLTYPE(XML)
    COLUMNS IMAGESWEB VARCHAR2(100) PATH '.'
)

但是我需要使用属性名称Image2获取另一个值,所以我做了另一个 XMLTABLE 但我想这不是正确的方法,我必须使用 XMLTABLE('/attrs/attr'... 两列,但不知道如何从 XPATH 中获得两者(XML 数据中可能缺少 Image2)?

这是一个 XML 示例(用于我的产品的 CLOB):

<attrs>
    <attr multiple="true" name="Image2">
        <string>IMG2.PNG</string>
        <string>IMG3.PNG</string>
        <string>IMG4</string>
    </attr>
    <attr multiple="true" name="ImagesWEB">
        <string>IMG.PNG</string>
    </attr>
    <attr name="ShortLink">
        <string>/PRODUCT.html</string>
    </attr>
    <attr name="TITRE">
        <string>TITLE</string>
    </attr>
    <attr name="name">
        <string>PRODUCT</string>
    </attr>
</attrs>

Thansk!

您可以更改主 XPath 以获取attrs ,然后在 Xpath 中为每个columns子句过滤您想要的内容:

XMLTABLE('/attrs'
    PASSING XMLTYPE(XML)
    COLUMNS
      IMAGESWEB VARCHAR2(100) PATH 'attr[@name="ImagesWEB"]/string',
      IMAGE2 VARCHAR2(100) PATH 'attr[@name="Image2"]/string'
)

db<> 摆弄一些虚构的数据。


但是如果我有两个值(可能会发生)怎么办?

如果您可以在一个属性下有多个string节点,那么您可以从一个 XMLTable 调用中获取两个attr节点,然后再有两个 - 每个 attr 一个 - 来获取字符串:

SELECT t.id, x2.imagesweb, x3.image2
FROM your_table t
CROSS APPLY
XMLTABLE('/attrs'
    PASSING XMLTYPE(t.XML)
    COLUMNS
      IMAGESWEB XMLTYPE PATH 'attr[@name="ImagesWEB"]',
      IMAGE2 XMLTYPE PATH 'attr[@name="Image2"]'
) x1
OUTER APPLY
XMLTABLE('/attr/string'
    PASSING x1.imagesweb
    COLUMNS
      IMAGESWEB VARCHAR2(100) PATH '.'
) x2
OUTER APPLY
XMLTABLE('/attr/string'
    PASSING x1.image2
    COLUMNS
      IMAGE2 VARCHAR2(100) PATH '.'
) x3
ID IMAGESWEB  IMAGE2
-- ---------  ----------
 1 ABC        DEF
 2 ABC
 3            DEF
 3            DEF2
 4 IMG.PNG    IMG2.PNG
 4 IMG.PNG    IMG3.PNG
 4 IMG.PNG    IMG4

db<>混合使用虚构数据和样本数据。

这使用交叉应用和外部应用(因为可能不存在一个或另一个属性),可从 Oracle 12c (12.1.0.1) 获得

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM