0

鉴于下面的 XML 示例,我如何<table_no>使用 Oracle XML 提取从上到下提取所有值。

基于以下,我希望从我的选择中看到以下单独的行:

1
4
2
11

Table: tickets
Column holding XML: ticket_col 

XML 代码:

<xml>
  <ticket_order>
    <table_no>1<table_no/>
    <waiter>Jack<waiter/>
    <total_people>12<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>4<table_no/>
    <waiter>Jackie<waiter/>
    <total_people>3<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>2<table_no/>
    <waiter>Sally<waiter/>
    <total_people>2<total_people/>
  </ticket_order>
  <ticket_order>
    <table_no>11<table_no/>
    <waiter>Mike<waiter/>
    <total_people>6<total_people/>
  </ticket_order>
</xml>
4

1 回答 1

2

您可以使用XMLTable(); 使用(固定)示例 XML 作为字符串内联:

select x.*
from xmltable(
 '/xml/ticket_order'
  passing xmltype('<xml>
  <ticket_order>
    <table_no>1</table_no>
    <waiter>Jack</waiter>
    <total_people>12</total_people>
  </ticket_order>
  <ticket_order>
    <table_no>4</table_no>
    <waiter>Jackie</waiter>
    <total_people>3</total_people>
  </ticket_order>
  <ticket_order>
    <table_no>2</table_no>
    <waiter>Sally</waiter>
    <total_people>2</total_people>
  </ticket_order>
  <ticket_order>
    <table_no>11</table_no>
    <waiter>Mike</waiter>
    <total_people>6</total_people>
  </ticket_order>
</xml>')
  columns table_no number path 'table_no'
) x;

  TABLE_NO
----------
         1
         4
         2
        11

如果 XML 是表中的字符串(VARCHAR2 或 CLOB),您将通过交叉连接将其传递:

select x.*
from your_table t
cross join xmltable(
  '/xml/ticket_order'
  passing xmltype(t.xml_string)
  columns table_no number path 'table_no'
) x;

如果它已经是表中的 XMLType,您将跳过该转换:

select x.*
from your_table t
cross join xmltable(
  '/xml/ticket_order'
  passing t.xml
  columns table_no number path 'table_no'
) x;

您可以一次获取多个列;并且生成的相关列名称不必与节点名称相同:

select x.*
from your_table t
cross join xmltable(
  '/xml/ticket_order'
  passing t.xml
  columns table_number number path 'table_no',
    server varchar2(10) path 'waiter',
    covers number path 'total_people'
) x;

TABLE_NUMBER SERVER         COVERS
------------ ---------- ----------
           1 Jack               12
           4 Jackie              3
           2 Sally               2
          11 Mike                6

阅读更多

于 2019-08-13T10:46:47.950 回答