عمليات المقارنة على XS: منطقية في 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);
العمود الأول ، القيمة ، يعيد صحيح. الباقي كل مرة خاطئة. إذن ، بعد أن تمكنت من إلقاء القيمة على النوع الصحيح ، كيف يمكنني التحقق من قيمتها بالفعل؟
المحلول
تحتاج إلى استخدام 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()
.