[英]How Extract from XMLTYPE column, corresponding label for value in a tag within a value/label list from same XML
我從帶有 XMLTYPE 列的 Oracle 表中得到一個 sql。 Xml 有一個值為“2”的標簽,在同一個 xml 中有一個值/標簽對列表,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<characteristics>
<motor>
<fuel>2</fuel>
</motor>
</characteristics>
<ValuesList>
<CarValues>
<CarValue>
<value>1</value>
<label>Diesel</label>
</CarValue>
<CarValue>
<value>2</value>
<label>Unleaded petrol</label>
</CarValue>
</CarValues>
</ValuesList>
</Root>
使用extract()
或extractValue()
函數,可以很容易地使用這些語句 a、b 中的任何一個獲取標簽的值
SELECT extract(t.xmlColumn, '//fuel/text()').getStringVal() a,
extractValue(t.xmlColumn, '//fuel') b
FROM Table t
問題是我想從 Valueslist 'Unleaded petrol' 中獲取值 '2' 的 label 文本
我嘗試使用 XPATH 表達式來獲取該值,如下所示:
extractValue(t.xmlColumn, '//CarValue/label[../value=//fuel]')
XPATH 已經用記事本 XML 工具進行了評估,可以使用,但是沒有辦法得到任何結果。 它總是 null。
知道如何實現這一目標嗎? 我不知道如何使用 XMLTABLE 或任何其他解決方案來解決這種情況。
您需要在嘗試中包含/text()
部分:
SELECT
extract(t.xmlColumn,'//fuel/text()').getStringVal() a
,extractValue(t.xmlColumn,'//fuel') b
,extractValue(t.xmlColumn, '//CarValue/label[../value=//fuel/text()]') c
FROM your_table t
一種 | 乙 | C |
---|---|---|
2個 | 2個 | 無鉛汽油 |
在您的版本中,您試圖將 label 與節點<fuel>2</fuel>
的值匹配,而不是節點2
中的文本。
extract()
和extractValue()
都已棄用,因此您可以改用 XMLQuery:
SELECT
XMLQuery('//fuel/text()' passing xmlColumn returning content) a
,XMLQuery('//CarValue/label[../value=//fuel/text()]/text()' passing xmlColumn returning content) a
FROM your_table t
一種 | 一種 |
---|---|
2個 | 無鉛汽油 |
或者用 XMLTable();
SELECT x.a, x.b
FROM your_table t
CROSS APPLY XMLTable(
'/'
passing t.xmlColumn
columns a number path '//fuel',
b varchar2(30) path '//CarValue/label[../value=//fuel/text()]'
) x
一種 | 乙 |
---|---|
2個 | 無鉛汽油 |
如果您的 Oracle 版本無法使用../
進行節點遍歷,那么您可以通過使用單獨的 XMLTable 調用獲取燃料值和所有 id/label 對,然后過濾匹配的那些來實現這一點:
SELECT x1.fuel, x2.label
FROM your_table t
CROSS JOIN XMLTable(
'//fuel'
passing t.xmlColumn
columns fuel number path '.'
) x1
JOIN XMLTable(
'//CarValue'
passing t.xmlColumn
columns value number path 'value',
label varchar2(30) path 'label'
) x2 ON x2.value = x1.fuel
燃料 | LABEL |
---|---|
2個 | 無鉛汽油 |
Alex Poole 給出的所有解決方案都是問題案例標題的可接受解決方案,其中存在“同一 XML 中的值/標簽列表”。
僅供參考,以防“同一 XML 中不存在值/標簽列表”,解決方案是創建一個輔助 XMLTable,其中包含 XMLTYPE 字段和值/標簽列表 XML。
SELECT x1.fuel, x2.labelFROM your_table t
CROSS JOIN XMLTable(
'//fuel'
passing t.xmlColumn
columns fuel number path '.'
) x1
LEFT JOIN XMLTable(
'//CarValue'
passing
(SELECT XMLTYPE('
<ValuesList>
<CarValues>
<CarValue>
<value>1</value>
<label>Diesel</label>
</CarValue>
<CarValue>
<value>2</value>
<label>Unleaded petrol</label>
</CarValue>
</CarValues>
</ValuesList>
') FROM dual)
columns value number path 'value',
label varchar2(30) path 'label'
) x2 ON x2.value = x1.fuel
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.