SQL Server 2005中对xs:boolean的比较操作

时间:2010-10-11 03:43:17

标签: sql-server sql-server-2005 xquery xquery-sql

任何人都可以向我解释此查询的结果:

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。其余的都归零。因此设法将值转换为正确的类型,我如何实际检查它的值?

1 个答案:

答案 0 :(得分:1)

您需要使用fn:false()false()以及fn:true()true(),而不只是撰写truefalse

这是一个正确的例子:

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 />元素。因此,只存在常量truefalse的函数,因为这是区分布尔常量和路径表达式的唯一方法。

更详细地说,使用否定在每个示例中仍会返回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

文字falsetrue都被计算为空序列,既不匹配布尔值false()也不匹配布尔值true()