Операции сравнения на XS: Boolean в SQL Server 2005
-
29-09-2019 - |
Вопрос
Кто -нибудь может объяснить мне результаты этого запроса:
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);
Первый столбец, значение, возвращает true. Остальные все возвращают ложь. Итак, удавлюсь отбросить значение правильному типу, как я действительно проверю его значение?
Решение
вам нужно использовать 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()
.