2015-10-24 94 views
1

處理我有一個表與內容的XMLType列如下:與XMLType列在甲骨文

<root> 
<item> 
    <case>1234</case> 
    <open>1</open> 
</item> 
<item> 
    <case>2345</case> 
    <open>0</open> 
</item> 
<item> 
    <case>3456</case> 
    <open>1</open> 
</item> 
/* ..other item blocks may follow.. */ 
</root> 

我想檢查是否有開啓/關閉的情況。
我應該在查詢WHERE子句中放入什麼?

目前,我得到了它在可能的最糟糕的方式工作:

SELECT somecolumn FROM sometable 
WHERE INSTR(EXTRACT(myxmlcolumn, '//open/text()'), '1') > 0 

基本上,我「扁平化」所有打開的元素的值的字符串(在示例XML以上:101)和然後查明是否有出現0 close或1開放。我需要更好的索引以避免全表掃描。

有沒有什麼辦法可以用SQL查詢檢索具有相應的「打開」值設置爲10的「case」元素?

我目前正在從我的應用程序代碼解析整個XML,因爲我一直沒有找到任何有關如何從Oracle端做到這一點的文檔。

感謝

回答

0

可以通過XPATH完成:

select myxmlcolumn.EXTRACT('//item[open=0]/case') from sometable 

,如果你想同時,開= 1 OR = 0,那麼

select myxmlcolumn.EXTRACT('//item[open=0 | open=1]/case') from sometable 
+0

這工作就像一個魅力,但我有修改查詢爲: '從sometable'選擇EXTRACT(myxmlcolumn,'// item [open = 1]/case')。 我也已經能夠在它上面創建一個索引,但是需要在'EXTRACT'函數的末尾加上'.getStringVal()'來使它工作。非常感謝。 – comcas