Db2 如果不存在,则使用xquery创建路径

Db2 如果不存在,则使用xquery创建路径,db2,xquery,Db2,Xquery,我的xml结构如下所示: 123 福巴 福 酒吧 它保存在DB2数据库的XML列中。其中/a/element/@name是唯一的,/b/element/@name是唯一的,等等 现在我想在其中一个中插入一个新元素标记,。如果已经存在具有相同name属性的元素,我想替换该元素(元素标记的顺序无关紧要)。我是这样做的: updatemytable set myXmlColumn=xmlquery('copy$new:=$old modify ( 删除$new/data/a/element[@na

我的xml结构如下所示:


123
福巴
福
酒吧
它保存在DB2数据库的XML列中。其中/a/element/@name是唯一的,/b/element/@name是唯一的,等等

现在我想在其中一个中插入一个新元素标记,。如果已经存在具有相同name属性的元素,我想替换该元素(元素标记的顺序无关紧要)。我是这样做的:

updatemytable set myXmlColumn=xmlquery('copy$new:=$old modify
(
删除$new/data/a/element[@name=$newName],
是否将$insert作为最后一个插入$new/data/a
)返回$new'
经过
“aName”作为“newName”,
xmlparse(文档“aaa”)作为“插入”),
myXmlColumn为“old”
)其中id=123
这将插入新元素,删除另一个同名元素(如果存在)。但是要知道,即使标记还不存在(在这种情况下,应该创建一个空标记并向其添加新元素),我也希望这样做能够起作用,并且如果myXmlColumn以前为null,它仍然能够起作用


对于后一个需求,我找到了一个解决方案,尽管它让我觉得很不雅观:在passing部分,我可以编写
coalesce(myXmlColumn,xmlparse(文档“”)
,如果myXmlColumn为null,这将使语句工作。但是如果它不是空的,只是缺少了一个值,那该怎么办呢?

我找到了一个可行的解决方案,尽管它仍然感觉很尴尬。我想知道是否有更优雅的解决方案

updatemytable set myXmlColumn=xmlquery('copy$xml:=(if(not($xml/data/a)),然后转换copy$xml:=$xml modify(do insert as last into$xml/data)return$xml else$xml)modify
(
是否删除$xml/data/a/element[@name=$newName],
将$insert作为最后一个插入到$xml/data/a中
)返回$xml'
经过
“aName”作为“newName”,
xmlparse(文档“aaa”)作为“插入”),
合并(myXmlColumn,xmlparse(文档“”)为“xml”
)其中id=123

我找到了一个有效的解决方案,尽管它仍然让人感觉尴尬。我想知道是否有更优雅的解决方案

updatemytable set myXmlColumn=xmlquery('copy$xml:=(if(not($xml/data/a)),然后转换copy$xml:=$xml modify(do insert as last into$xml/data)return$xml else$xml)modify
(
是否删除$xml/data/a/element[@name=$newName],
将$insert作为最后一个插入到$xml/data/a中
)返回$xml'
经过
“aName”作为“newName”,
xmlparse(文档“aaa”)作为“插入”),
合并(myXmlColumn,xmlparse(文档“”)为“xml”
)其中id=123

您可以在XQuery表达式中添加if-then逻辑,该逻辑将根据存在的节点添加不同数量的XML。这种方法使您具有最大的灵活性,因为它可以编程处理几乎任何可能的情况,例如/data存在的位置,而不是/data/a。当根文档元素不是
时,您甚至可以决定要做什么


关于CueSeCe(),我喜欢它,并且认为它是对您描述的条件的一个有价值的解决方案。

< P>您可以添加XQuery表达式中的如果是逻辑,这将取决于哪些节点存在不同的XML量。这种方法使您具有最大的灵活性,因为它可以编程处理几乎任何可能的情况,例如/data存在的位置,而不是/data/a。当根文档元素不是
时,您甚至可以决定要做什么

关于CueSeCe(),我喜欢它,并且认为它是一个值得注意的解决方案。