У меня есть структура XML, которая выглядит следующим образом:
<data>
<a>
<element name="aName">123</element>
<element name="xyz">foobar</element>
</a>
<b>
<element name="aName">foo</element>
<element name="otherName">bar</element>
</b>
</data>
Который сохраняется в столбце XML в базе данных DB2. Внутри / a / element / @ name уникально, а / b / element / @ name уникально и т. Д.
Теперь я хочу вставить новый тег элемента либо в,. Если элемент с таким же атрибутом имени уже существует, я хочу заменить этот элемент (порядок тегов элемента не имеет значения). Я сделал это так:
update mytable set myXmlColumn=xmlquery('copy $new := $old modify
(
do delete $new/data/a/element[@name=$newName],
do insert $insert as last into $new/data/a
) return $new'
passing
'aName' as "newName",
xmlparse(document '<element name="aName">aaa</element>') as "insert"),
myXmlColumn as "old"
) where id=123
При этом новый элемент вставляется правильно, удаляя другой элемент с тем же именем, если он существовал. Но знайте, я хочу, чтобы это работало, даже если тег еще не существует (в этом случае должен быть создан пустой тег и добавлен новый элемент), и он все равно должен работать, если myXmlColumn ранее был нулевым.
Для последнего требования я нашел решение, хотя оно кажется мне довольно не элегантным: в проходящем разделе я могу написать coalesce(myXmlColumn,xmlparse(document '<data><a /></data>'))
, который заставит оператор работать, если myXmlColumn равен нулю. Но что, если он не нулевой, а просто отсутствует?