operazioni di confronto su xs: boolean in SQL Server 2005
-
29-09-2019 - |
Domanda
Qualcuno può spiegare a me i risultati di questa 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);
La prima colonna, valore, restituisce true. Il resto tutto falso di ritorno. Quindi, dopo aver saputo il cast del valore al tipo corretto, come faccio io in realtà controllare il suo valore?
Soluzione
è necessario utilizzare fn:false()
o false()
e fn:true()
o true()
invece di scrivere true
o false
.
Questo è un esempio corretto:
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
Se non si utilizza la funzione false()
, false
viene elaborata come un'espressione di percorso, cioè il processore pensa che si richiede per un elemento <false />
. Pertanto, esiste solo una funzione per le costanti true
e false
, perché questo è l'unico modo per distinguere tra le costanti booleane e un'espressione di percorso.
In particolare, utilizzando la negazione sarebbe ancora tornare false
in ogni esempio.
Questo non è ciò che si vuole (solo per dimostrare):
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
letterali false
e true
entrambi sono valutati per una sequenza vuota che non corrisponde al valore booleano false()
né il valore true()
booleano.