簡體   English   中英

如何從 XMLTYPE 列中提取,相應的 label 用於來自相同 XML 的值/標簽列表中的標簽中的值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM