Xquery版本的“NOT IN”子句无法按预期工作

时间:2015-10-24 14:54:27

标签: xquery basex

我有一个xml文件,可以在以下链接中下载: http://expirebox.com/download/483d465091802df68da10feddc1ec98c.html

我试图在我的movies.xml中选择所有没有“真人”和“阵营”风格的电影。为实现这一点,我使用以下查询

for $movie in db:open("movies","movies.xml")/movies/movie
where $movie/styles/style!=("noir","anthology")
return $movie

但是,电影中的所有节点都会被选中。我的查询出了什么问题?

一些专家指出,由于涉及XQuery的语义,标准不能在这种情况下不兼容运算符。但是,我的目的是找到一个SQL功能的相应查询,而不仅仅是理解语义。

1 个答案:

答案 0 :(得分:2)

!=使用set比较逻辑。

对于不在该序列中的值,例如" foo",表达式"foo" != ("noir", "anthology")返回true但是,表达式"noir" != ("noir", "anthology")也将返回{{ 1}}。这是因为" noir"不等于序列中的一个项目"选集",即使它也等于序列中的一个项目。表达式true返回"noir" = ("noir", "anthology")因为" noir"等于序列中的一个项目," noir"。

参考规格: https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans

  

注意:如果true绑定到节点集,则$x$x="foo"的含义不同:当且仅当not($x!="foo")中的某个节点时,前者为真1}}具有字符串值$x;当且仅当foo中的所有节点都具有字符串值$x时,后者才为真。

使用:

foo

或:

where not($movie/styles/style=("noir","anthology"))