См. Следующий запрос:
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 Целевой узел выражения "replace" в XQuery недопустим.
Может быть, я ошибаюсь в синтаксисе, если я думал, и часть "then" выполняется в обоих запросах выше. Поэтому я попытался поменять местами then и else, поскольку явно DB2 не должна пытаться выполнить часть then и else. Но это ничего не изменило.
Теперь я явно растерялся. Разве нельзя делать то, что мне нравится делать с XPath, потому что все выражения пути должны быть выполнены независимо от того, выполняются они или нет? Или я просто что-то не так делаю?