【问题标题】:Xquery version of "NOT IN" clause not working as expected“NOT IN”子句的 Xquery 版本未按预期工作
【发布时间】:2015-10-24 14:54:26
【问题描述】:

我有一个 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 特性的对应查询,而不仅仅是理解语义。

【问题讨论】:

标签: xquery basex


【解决方案1】:

!= 使用集合比较逻辑。

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

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

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

用途:

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

或:

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

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多