SQL Server 2005 中 xs:boolean 的比较运算
谁能向我解释一下这个查询的结果:
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。其余全部返回 false。那么,在设法将值转换为正确的类型后,我如何实际检查它的值呢?
Can anyone explain to me the results of this query:
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);
The first column, Value, returns true. The rest all return false. So having managed to cast the value to the correct type, how do I actually check it's value?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您需要使用
fn:false()
或false()
和fn:true()
或true()
> 而不是只写true
或false
。这是一个正确的例子:
如果不使用函数
false()
,false
会被当作路径表达式来处理,即处理器认为您正在查询
元素。因此,只存在常量true
和false
的函数,因为这是区分布尔常量和路径表达式的唯一方法。更详细地说,在每个示例中使用否定仍然会返回
false
。这不是你想要的(只是为了演示):
文字
false
和true
都被评估为一个空序列,与布尔值都不匹配值false()
也不是布尔值true()
。you need to use
fn:false()
orfalse()
andfn:true()
ortrue()
instead of just writingtrue
orfalse
.This is a correct example:
If you don't use the function
false()
,false
is processed as a path expression, i.e. the processor thinks you are querying for a<false />
element. Therefore, there only exists a function for the constantstrue
andfalse
, because this is the only way to distinguish between the boolean constants and a path expression.More in detail, using the negation would still return
false
in each example.This is not what you want (just to demonstrate):
the literals
false
andtrue
both are evaluated to an empty sequence which neither matches the boolean valuefalse()
nor the boolean valuetrue()
.