0

誰かが私にこのクエリの結果を説明できますか?

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を返します。値を正しいタイプにキャストできたので、実際にその値を確認するにはどうすればよいですか?

4

1 に答える 1

1

単にorを書く代わりに、orandまたはorfn: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

リテラルfalseと両方は、ブール値にもtrueブール値にも一致しない空のシーケンスに評価されます。false()true()

于 2010-10-11T07:39:42.203 に答える