簡體   English   中英

XPath不存在時,Oracle XMLTABLE左外部聯接不會返回結果

[英]Oracle XMLTABLE left outer join doesn't return results when XPath doesn't exist

表tbl具有XMLTYPE類型的xml_data列。 考慮以下XML:

<root>
  <element>
    <id>1</id>
    <data>abc</data>
  </element>
  <element>
    <id>2</id>
    <data>def</data>
  </element>
</root>

我需要一條select語句,該語句將為tbl中的每一行返回1行,其中包含3列:id1,id2和id3。

id1將從“ id”為1的“ element”節點獲取“ data”標簽的值。id2將從“ id”為2的節點獲取值。

如果沒有特定ID的元素(例如上述XML中的id3),則該列將返回NULL。

所以對於上面的XML我想

   id1    id2    id3
   --------------------
1  abc    def    -

我試過了:

select id1.val, id2.val, id3.val
from tbl t,
  xmltable ('/root/element[id=1]'
    passing t.xml_data
    columns val varchar2 (100) path 'data') id1,
  xmltable ('/root/element[id=2]'
    passing t.xml_data
    columns val varchar2 (100) path 'data') id2,
  xmltable ('/root/element[id=3]'
    passing t.xml_data
    columns val varchar2 (100) path 'data') id3;

但是我得到0行,因為沒有'/ root / element [id = 3]'。

我嘗試添加(+):

xmltable ('/root/element[id=3]'
        passing t.xml_data
        columns val varchar2 (100) path 'data') (+) id3;

它沒有幫助(ON 1 = 1的LEFT OUTER JOIN都沒有)。

我注意到,如果XMLQuery一樣有效,但“路徑”的XMLTABLE內不存在,它工作並返回NULL(即使沒有(+)),但如果XQuery的本身不存在如[ID = 3]無效。

select id1.val, id2.val, id3.val
from tbl t,
  xmltable ('/root/element[id=1]'
    passing t.xml_data
    columns val varchar2 (100) path 'data') id1,
  xmltable ('/root/element[id=2]'
    passing t.xml_data
    columns val varchar2 (100) path 'data') id2,
  xmltable ('/root/element[id=2]'
    passing t.xml_data
    columns val varchar2 (100) path 'doesnt-exist') id3;

返回值:

   id1    id2    id3
   --------------------
1  abc    def    -

您不需要多次調用XMLTable,可以將元素選擇移到列path子句中,並具有三個這樣的子句:

select x.id1, x.id2, x.id3
from tbl t
cross join
  xmltable ('/root'
    passing t.xml_data
    columns id1 varchar2 (100) path 'element[id=1]/data',
       id2 varchar2 (100) path 'element[id=2]/data',
       id3 varchar2 (100) path 'element[id=3]/data'
) x;

ID1   ID2   ID3 
----- ----- -----
abc   def        

希望這可以幫助

WITH TEMP AS(
SELECT ID,DATA_VALUE
  FROM XMLTABLE('./root/element' PASSING XMLTYPE('<root>
  <element>
    <id>1</id>
    <data>abc</data>
  </element>
  <element>
    <id>2</id>
    <data>def</data>
  </element>
</root>')
COLUMNS ID NUMBER PATH './id',
        DATA_VALUE VARCHAR2(240) PATH './data'))
SELECT (SELECT DATA_VALUE FROM TEMP WHERE ID = 1) ID1, 
      (SELECT DATA_VALUE FROM TEMP WHERE ID = 2) ID2,
      (SELECT DATA_VALUE FROM TEMP WHERE ID = 3) ID3
  FROM DUAL;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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