Операции сравнения на xs: boolean в SQL Server 2005 - PullRequest
0 голосов
/ 11 октября 2010

Может ли кто-нибудь объяснить мне результаты этого запроса:

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 Ответ

1 голос
/ 11 октября 2010

вам нужно использовать fn:false() или false() и fn:true() или true() вместо того, чтобы просто писать true или false.

Это правильный пример:

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 />.Следовательно, существует функция только для констант true и false, поскольку это единственный способ провести различие между логическими константами и выражением пути.

Более подробно, использование отрицания все равновернуть 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().

...