سؤال

لقد جئت عبر هذه في جملة WHERE:

AND NOT (t.id = @id)

وكيف تقارن:

AND t.id != @id

أو مع:

AND t.id <> @id

كنت دائما أكتب هذا الأخير نفسي ، ولكن من الواضح شخص آخر يفكر بطريقة مختلفة.هو ذاهب لأداء أي أفضل من الآخر ؟ أنا أعرف أن استخدام <> أو != هو الذهاب إلى التمثال أي آمال باستخدام مؤشر الذي قد كان لي ، ولكن بالتأكيد النهج الأول أعلاه سوف تعاني من نفس المشكلة ؟

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

المحلول

هذه 3 سوف تحصل على نفس خطة التنفيذ

declare @id varchar(40)
select @id = '172-32-1176'

select * from authors
where au_id <> @id

select * from authors
where au_id != @id

select * from authors
where not (au_id = @id)

وسوف تعتمد أيضا على الانتقائية مؤشر نفسها بطبيعة الحال.أنا دائما استخدام au_id <> @id نفسي

نصائح أخرى

علما أن != مشغل SQL القياسية.إذا كنت تريد الخاص بك التعليمات البرمجية المحمولة (هذا إذا كنت الرعاية) ، استخدام <> بدلا من ذلك.

فقط قليلا adjustement fors أولئك الذين يأتون في وقت لاحق:

المساواة بين المشغل توليد unknow القيمة عندما يكون هناك null والمجهول قيمة تعامل كاذبة.لا (غير معروف) غير معروف

في المثال أدناه سأحاول أن أقول إذا كان الزوجان (a1, b1) يساوي (a2, b2).لاحظ أن كل الأعمدة 3 القيم 0 و 1 و فارغة.

DECLARE @t table (a1 bit, a2 bit, b1 bit, b2 bit)

Insert into @t (a1 , a2, b1, b2) 
values( 0 , 0 , 0 , NULL )

select 
a1,a2,b1,b2,
case when (
    (a1=a2 or (a1 is null and a2 is null))
and (b1=b2 or (b1 is null and b2 is null))
)
then 
'Equal'
end,
case when not (
    (a1=a2 or (a1 is null and a2 is null))
and (b1=b2 or (b1 is null and b2 is null))
)
then 
'not Equal'
end,
case when (
    (a1<>a2 or (a1 is null and a2 is not null) or (a1 is not null and a2 is null))
or (b1<>b2 or (b1 is null and b2 is not null) or (b1 is not null and b2 is null))
)
then 
'Different'
end
from @t

نلاحظ أن هنا نتوقع النتائج :

  • المساواة أن تكون فارغة
  • لا يساوي أن لا متساوية
  • مختلفة مختلفة

ولكن حصلنا على نتيجة أخرى

  • تساوي null موافق
  • لا تساوي null ???
  • مختلفة مختلفة

لن يكون هناك أداء ضرب كل البيانات متساوية تماما.

HTH

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top