"NOT IN" 子句的 Xquery 版本未按预期工作
Xquery version of "NOT IN" clause not working as expected
我有一个xml文件可以在下面link下载:
http://expirebox.com/download/483d465091802df68da10feddc1ec98c.html
我正在尝试 select 我的 movies.xml 中所有那些没有 "live action" 和 "camp" 风格的电影。为此,我使用以下查询
for $movie in db:open("movies","movies.xml")/movies/movie
where $movie/styles/style!=("noir","anthology")
return $movie
但是,电影中的所有节点都得到 selected。我的查询出了什么问题?
一些专家指出,由于涉及 XQuery 的语义,标准不等于运算符无法在这种情况下工作。但是,我的目的是找到一个 SQL 特征的相应查询,而不仅仅是理解语义。
!=
使用集合比较逻辑。
对于不在该序列中的值,例如 "foo",表达式 "foo" != ("noir", "anthology")
returns true
然而,表达式 "noir" != ("noir", "anthology")
将还有 return true
。这是因为 "noir" 不等于序列中的一项,"anthology",即使它也等于序列中的一项。表达式 "noir" = ("noir", "anthology")
returns true
因为 "noir" 等于序列中的一项,"noir".
参考规范:
https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans
NOTE: If $x
is bound to a node-set, then $x="foo"
does not mean the same as not($x!="foo")
: the former is true if and only if some node in $x
has the string-value foo
; the latter is true if and only if all nodes in $x
have the string-value foo
.
使用:
where not($movie/styles/style=("noir","anthology"))
或:
where $movie/styles/style[not(.=("noir","anthology"))]
我有一个xml文件可以在下面link下载: http://expirebox.com/download/483d465091802df68da10feddc1ec98c.html
我正在尝试 select 我的 movies.xml 中所有那些没有 "live action" 和 "camp" 风格的电影。为此,我使用以下查询
for $movie in db:open("movies","movies.xml")/movies/movie
where $movie/styles/style!=("noir","anthology")
return $movie
但是,电影中的所有节点都得到 selected。我的查询出了什么问题?
一些专家指出,由于涉及 XQuery 的语义,标准不等于运算符无法在这种情况下工作。但是,我的目的是找到一个 SQL 特征的相应查询,而不仅仅是理解语义。
!=
使用集合比较逻辑。
对于不在该序列中的值,例如 "foo",表达式 "foo" != ("noir", "anthology")
returns true
然而,表达式 "noir" != ("noir", "anthology")
将还有 return true
。这是因为 "noir" 不等于序列中的一项,"anthology",即使它也等于序列中的一项。表达式 "noir" = ("noir", "anthology")
returns true
因为 "noir" 等于序列中的一项,"noir".
参考规范: https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans
NOTE: If
$x
is bound to a node-set, then$x="foo"
does not mean the same asnot($x!="foo")
: the former is true if and only if some node in$x
has the string-valuefoo
; the latter is true if and only if all nodes in$x
have the string-valuefoo
.
使用:
where not($movie/styles/style=("noir","anthology"))
或:
where $movie/styles/style[not(.=("noir","anthology"))]