如果你實際上是從包含XML文檔,其中還有你的一個(無效)片段的CLOB開始,那麼你可以使用built-in XML DB的功能是直接從XML中提取數據。
您似乎想要匹配任何以Department
結尾的節點,並將該節點名稱的第一部分作爲部門名稱以及其下的術語和容量值進行提取。
你可以做到這一點與XMLTable和合適的XPath,例如:
-- CTE to represent your raw XML CLOB, with dummy root node
with university (department) as (
select to_clob('<root>
<ElectronicsDepartment>
<term>I year</term>
<Capacity>60</Capacity>
</ElectronicsDepartment>
<ComputersDepartment>
<term>I year</term>
<Capacity>65</Capacity>
</ComputersDepartment>
<MechanicalDepartment>
<term>I year</term>
<Capacity>65</Capacity>
</MechanicalDepartment>
</root>') from dual
)
-- end of CTE, actual query below
select x.department, x.term, x.capacity
from university u
cross join xmltable (
'//*[ends-with(name(), "Department")]'
passing xmltype(u.department)
columns department varchar2(20) path 'substring(name(), 1, string-length(name()) - 10)',
term varchar2(10) path 'term',
capacity number path 'Capacity'
) x;
DEPARTMENT TERM CAPACITY
-------------------- ---------- ----------
Electronics I year 60
Computers I year 65
Mechanical I year 65
的'//*[ends-with(name(), "Department")]'
只匹配以Department
端節點。 'substring(name(), 1, string-length(name()) - 10)'
從該節點名稱中提取除最後10個字符以外的所有內容,獲得Computers
或其他任何內容。其他兩列更直接。
如果您需要過濾包含哪些CLOB,則可以在from
和與XMLTable的連接之後正常添加where
子句,例如,在university
表中的時間戳列上進行篩選:
select x.department, x.term, x.capacity
from university u
cross join xmltable (
'//*[ends-with(name(), "Department")]'
passing xmltype(u.department)
columns department varchar2(20) path 'substring(name(), 1, string-length(name()) - 10)',
term varchar2(10) path 'term',
capacity number path 'Capacity'
) x
where your_timestamp_col >= timestamp '2017-06-01 00:00:00'
and your_timestamp_col < timestamp '2017-07-01 00:00:00';
您正試圖將Department值劃分爲另一個值。你想用'/'符號做什麼? –
「/」是from子句 – Sawyer
中子查詢的語法什麼是「大學」 - 一種已經將XML數據提取爲關係形式的視圖?或者是一個具有'department'作爲包含XML的CLOB的表,以及單獨的術語和容量列?這兩者都沒有道理。請將DDL表添加到問題中,並對其他列的內容進行採樣。 –