请参阅以下查询:
select
xmlquery
(
'
if ($xml/foo/bar) then
transform copy $xml := $xml modify do replace $xml/foo/bar with <bar>some stuff</bar> return $xml
else
$xml
'
passing xmlparse(document '<foo><bar>something here</bar></foo>') as "xml"
)
from sysibm.sysdummy1
这个查询工作正常:它取代了/ foo / bar节点,我非常高兴。如果/ foo / bar节点不存在,我只是不想发生任何事情。因此,以下查询应该只返回未修改的XML:
select
xmlquery
(
'
if ($xml/foo/bar) then
transform copy $xml := $xml modify do replace $xml/foo/bar with <bar>some stuff</bar> return $xml
else
$xml
'
passing xmlparse(document '<foo>nothing here</foo>') as "xml"
)
from sysibm.sysdummy1
嗯......所以我想。事实上,DB2愉快地告诉我:
SQL16085N XQuery“replace”表达式的目标节点无效。
也许我对if if think的语法错了,并且在上面的两个查询中都执行了“then”-part。所以我尝试交换then和else,因为很明显DB2不应该尝试执行then和else部分。但这根本没有改变任何东西。
现在我显然很困惑。是不是可以做我喜欢用XPath做的事情,因为无论它们是否被执行都必须满足所有路径表达式?或者我只是做错了什么?
答案 0 :(得分:1)
我有类似的问题,我解决了这个问题:
select
xmlquery('
let $xml0 := <xml><foo><bar/></foo></xml> return
if ($xml/foo/bar) then
transform copy $xml := ($xml[foo/bar], $xml0)[1] modify
do replace $xml/foo/bar with <bar>some stuff</bar>
return $xml
else
$xml
' passing xmlparse(document '<foo>nothing here</foo>') as "xml")
from sysibm.sysdummy1
这似乎是一个错误
答案 1 :(得分:0)
并且你不会使用任何类型的函数“exists(....)”例如fn:exists(item1,item2 ...)其中如果参数的值不是空的,则exists函数返回true序列,否则返回false? 当然,我对db2一无所知:)。