[英]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.