任何人都可以向我解释此查询的结果:
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);
第一列Value返回true。其余的都归零。因此设法将值转换为正确的类型,我如何实际检查它的值?
答案 0 :(得分:1)
您需要使用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()
。