XS的比较操作:SQL Server 2005中的布尔值
-
29-09-2019 - |
题
谁能向我解释此查询的结果:
declare @xml xml;
set @xml = '<node attribute="true">Val</node>';
select
T.c.query('xs:boolean(@attribute[1])') Value,
T.c.query('xs:boolean(@attribute[1]) = false') ValueEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) = true') ValueEqualsTrue,
T.c.query('xs:boolean(@attribute[1]) != false') ValueNotEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) != true') ValueNotEqualsTrue
from @Xml.nodes('node') T(c);
第一列,值返回true。其余的全部返回false。因此,在设法将值投入正确的类型之后,我该如何实际检查其值?
解决方案
您需要使用 fn:false()
或者 false()
和 fn:true()
或者 true()
而不仅仅是写 true
或者 false
.
这是一个正确的例子:
T.c.query('xs:boolean(@attribute[1]) = false()') ValueEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) = true()') ValueEqualsTrue,
T.c.query('xs:boolean(@attribute[1]) != false()') ValueNotEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) != true()') ValueNotEqualsTrue
如果您不使用该功能 false()
, false
被处理为路径表达式,即处理器认为您正在查询一个 <false />
元素。因此,只有常数的函数 true
和 false
, ,因为这是区分布尔常数和路径表达的唯一方法。
更详细的是,使用否定仍将返回 false
在每个示例中。
这不是您想要的(只是要演示):
T.c.query('not(xs:boolean(@attribute[1])) = false') ValueEqualsFalse,
T.c.query('not(xs:boolean(@attribute[1])) = true') ValueEqualsTrue,
T.c.query('not(xs:boolean(@attribute[1])) != false') ValueNotEqualsFalse,
T.c.query('not(xs:boolean(@attribute[1])) != true') ValueNotEqualsTrue
文字 false
和 true
两者都被评估为一个空的序列,该序列都不匹配布尔值 false()
也不是布尔价值 true()
.
不隶属于 StackOverflow