منطقية "NOT" في T-SQL لا تعمل على نوع البيانات 'قليلا'؟

StackOverflow https://stackoverflow.com/questions/177762

سؤال

ومحاولة إجراء منطقي واحد NOT العملية، يبدو أنه في ظل MS SQL Server 2005 أو لا يعمل الكتلة التالية

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = NOT @MyBoolean;
SELECT @MyBoolean;

وبدلا من ذلك، أنا على الحصول على أكثر نجاحا مع

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = 1 - @MyBoolean;
SELECT @MyBoolean;

ولكن هذا يبدو قليلا وسيلة ملتوية للتعبير عن شيء بسيط مثل النفي.

وأنا شيء مفقود؟

هل كانت مفيدة؟

المحلول

استخدم ل~ المشغل:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean

نصائح أخرى

والحل الخاص بك هو فكرة جيدة ... يمكنك أيضا استخدام هذه الجملة لتبديل قليلا في SQL ...

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;

وطرح القيمة من 1 تبدو انها سوف تفعل خدعة، ولكن من حيث التعبير عن نية أعتقد أنني كنت أفضل أن يذهب مع:

SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END

وانها اكثر مطول ولكن أعتقد أنه من أسهل قليلا لفهم.

في SQL 2005 لم يكن هناك قيمة منطقية حقيقية، وقيمة الشيء شيء آخر حقا.

وهناك القليل يمكن أن يكون لها ثلاث ولايات، 1، 0 وفارغة (لأنه من البيانات). SQL لا يتم تلقائيا تحويل هذه إلى صواب أو خطأ (على الرغم من أن مدير المؤسسة SQL مشوش سوف)

وأفضل طريقة للتفكير في حقول بت في المنطق هو كعدد هذا 1 أو 0.

إذا كنت تستخدم منطق مباشرة على حقل بت انها سوف تتصرف مثل أي متغير قيمة الآخرين - أي والمنطق يكون صحيحا إذا كان لديه قيمة (أي القيمة) وكاذبة غير ذلك

لتعيين بعض الشيء مقلوب، ستحتاج إلى استخدام أحادي المعامل NOT المشغل. عند استخدام أحادي المعامل NOT المشغل، '~'، لديك للتأكد من أعلن عمود أو المتغير كما قليلا.

وهذا لن تعطيك الصفر:

Select ~1 

وهذه الإرادة:

select ~convert(bit, 1)

وهكذا سيكون هذا:

declare @t bit
set @t=1
select ~@t

وBIT هو نوع البيانات الرقمية، وليس منطقي. لهذا السبب لا يمكن تطبيق العوامل المنطقية لذلك.
لم يقم SQL خادم بوليان (غير متأكدة SQL SERVER 2008) ولذلك عليك أن تتمسك بشيء مثل حلMatt هاملتون.

استخدم ABS للحصول على القيمة المطلقة (-1 يصبح 1) ...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top