2010-10-11 29 views
0

Quelqu'un peut-il me expliquer les résultats de cette requête:opérations de comparaison sur xs: boolean dans SQL Server 2005

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); 

La première colonne, la valeur, retourne vrai. Les autres retournent tous faux. Donc, ayant réussi à mettre la valeur au bon type, comment puis-je vérifier sa valeur?

Répondre

1

vous devez utiliser fn:false() ou false() et fn:true() ou true() au lieu d'écrire juste true ou false.

Ceci est un exemple correct:

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 

Si vous n'utilisez pas la fonction false(), false est traitée comme une expression de chemin, à savoir le processeur pense que vous interrogez pour un élément <false />. Par conséquent, il existe uniquement une fonction pour les constantes true et false, car c'est la seule façon de distinguer entre les constantes booléennes et une expression de chemin.

Plus en détail, en utilisant la négation renverrait toujours false dans chaque exemple.

Ce n'est pas ce que vous voulez (juste pour montrer):

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 

les littéraux false et true les deux sont évalués à une séquence vide qui ne correspond à la valeur booléenne false() ni la valeur booléenne true().

+0

La séquence vide n'est pas convertie en 'false' dans le dernier cas. Au lieu de cela, vous comparez une valeur booléenne avec une séquence vide. Les opérateurs '=' et '! =' Sont des comparaisons de séquences, et retournent vrai s'il y a une paire d'éléments dans les séquences d'entrée qui satisfont la comparaison. Comme il n'y a aucun élément dans la séquence vide qui satisfasse la comparaison, le résultat de tous ces cas est false(). –

+0

Merci Oliver! Mon erreur. J'ai édité le post. –

+0

Merci Dennis et Oliver! –