我有一個包含xmltype列和其他非xmltype列的表(Oracle 11.2.0.2)。我想根據一些非xmltype列的值和xmltype列的內容做一個選擇。子選項中的oracle xmlcast(xmlquery)
我試過在我的選擇中使用xmlquery來做這件事,但我得到了一些有趣的結果。以下是我的數據簡化版本:包含用戶名和訂單詳細信息的訂單表。
-- create order table
create table orders(username varchar2(20), order_data xmltype);
-- an order entered by jim
insert into orders values ('jim', xmltype('
<ord:order xmlns:ord="http://www.blah.com/order/1.0">
<ord:zip>123</ord:zip>
<ord:date_time>2012-09-24T00:27:00</ord:date_time>
<ord:item>
<ord:product>A</ord:product>
<ord:quantity>12</ord:quantity>
</ord:item>
<ord:item>
<ord:product>B</ord:product>
<ord:quantity>34</ord:quantity>
</ord:item>
</ord:order>'));
-- an order entered by bob
insert into orders values ('bob', xmltype('
<ord:order xmlns:ord="http://www.blah.com/order/1.0">
<ord:zip>123</ord:zip>
<ord:date_time>2012-09-24T00:27:00</ord:date_time>
<ord:item>
<ord:product>A</ord:product>
<ord:quantity>56</ord:quantity>
</ord:item>
<ord:item>
<ord:product>C</ord:product>
<ord:quantity>78</ord:quantity>
</ord:item>
</ord:order>'));
舉個例子查詢,我試圖找到它做這個有超過1項由Bob輸入的所有訂單:
SELECT username, itemcount
FROM
(SELECT username,
XMLCAST(XMLQUERY('count(/*:order/*:item)' PASSING order_data RETURNING CONTENT) AS NUMBER) itemcount
FROM orders
)
WHERE username = 'bob'
AND itemcount > 1
,但它不返回任何結果,但是如果我註釋掉最後一行(和ITEMCOUNT> 1)我得到:
username | linecount
--------------------
bob | 2
...我不知道這是爲什麼,我想,也許它不是把它當作正確的類型,但我使用xmlcast將其轉換爲數字。
更重要的是令人費解的是,如果我設定的最後一行是:
AND itemcount = 2
...它再次消失了,但如果我把它改爲:
AND itemcount != -7
...它再次出現在結果,但與零值:
username | linecount
--------------------
bob | 0
所以,我很困惑 - 我一定是做錯了什麼,但我看不出它是什麼。
我發現使用XMLTABLE工作正常解決方法,讓會做我:
SELECT username, X.*
FROM orders,
XMLTABLE (
xmlnamespaces ('http://www.blah.com/order/1.0' AS "ord"),
'/ord:order' PASSING order_data
COLUMNS
itemcount number PATH 'count(ord:item)') AS X
WHERE username = 'bob'
AND itemcount > 1
我可以用這樣的xmltable得到正確的答案,所以這會現在做我 - 也許我應該爲此使用xmltable: – nodge