簡體   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