XQuery (DB2) заменит узел, если он существует. Можно вообще? - PullRequest
0 голосов
/ 02 июля 2011

См. Следующий запрос:

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, потому что все выражения пути должны быть выполнены независимо от того, выполняются они или нет? Или я просто что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 27 августа 2012

У меня была похожая проблема, и я решил ее так:

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

Вроде как ошибка

0 голосов
/ 07 июля 2011

И, если вы не используете какой-либо тип функции "Существует (....)", например, fn: exist (item1, item2 ...), где существует функция возвращает true, если значение аргументов НЕ является пустымпоследовательность, иначе он возвращает ложь?Конечно, я ничего не знаю о db2:)

...