我正在尝试在Sedna数据库上执行xquery以有条件地更新容器,如下所示
if(fn:exists(doc("blog")/entries/entry[@active="1" and @id="1"]/comments)) then
UPDATE insert <comment active="1"><name>sunil.s</name><email>suni.l.s@gmail.com</email><desc>desbbh</desc></comment> into doc("blog")/entries/entry[@active="1" and @id="1"]/comments
else
UPDATE insert <comments><comment active="1"><name>sunil.s</name><email>sunil.s@gmail.com</email><desc>sdd</desc></comment></comments> into doc("blog")/entries/entry[@active="1" and @id="1"]
但此查询总是失败并出现以下错误
SEDNA消息:ERROR XPST0003如果表达式是静态错误 不是A.1 EBNF中定义的语法的有效实例。细节:at (2:8),语法错误,意外插入,期待其他
错误表明第二行中预计会else
而不是insert
。
有人可以帮我理解查询问题和可能的解决方法吗?
答案 0 :(得分:0)
您的查询假设存在一个语法类似
的表达式UPDATE insert expr into expr
XQuery(或XQuery Update Facility)中没有这样的表达式。相反,它似乎是Sedna支持的非标准语法。
但是,文档(http://www.sedna.org/progguide/ProgGuidesu6.html#x12-430002.3)将其称为“语句”,而不是“表达式”,表明它必须是查询中的“顶级”(最外层)构造。
要完成此操作,您可以将查询重写为:
UPDATE
insert
if ... then <comment>...</comment> else <comments>...</comments>
into
if ... then doc("blog")/.../comments else doc("blog")/...
不幸的是,这会重复'if'条件;尚不清楚Sedna是否提供了将其分解的语法,例如
UPDATE
let $c := ...
insert
if $c then <comment>...</comment> else <comments>...</comments>
into
if $c then doc("blog")/.../comments else doc("blog")/...