2008-08-11 22 views
46

मैं सिर्फ यह भर में एक कहां खंड में आए हैं:परीक्षण T-SQL में असमानता के लिए

AND t.id != @id 

या साथ:

AND NOT (t.id = @id) 

कैसे इस के साथ तुलना

AND t.id <> @id 

मैं हमेशा बाद वाले को लिखता हूं, लेकिन स्पष्ट रूप से कोई और अलग-अलग सोचता है। क्या कोई दूसरे से बेहतर प्रदर्शन करने जा रहा है? मुझे पता है कि <> या != का उपयोग कर किसी इंडेक्स का उपयोग करने के लिए किसी भी उम्मीद को बस्ट करने जा रहा है, लेकिन निश्चित रूप से उपरोक्त पहला दृष्टिकोण एक ही समस्या का सामना करेगा?

+1

भी देखें: http://stackoverflow.com/questions/723195/should-i-use-or-for-not-equal-in-tsql – Dinah

उत्तर

41

ये 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 अपने आप

+5

कैसे ये धाराएं nulls का इलाज करते हैं ? क्या वे सब समकक्ष हैं? – FistOfFury

5

कोई प्रदर्शन हिट नहीं होगी, दोनों कथन पूरी तरह से बराबर हैं।

एचटीएच

30

ध्यान दें कि! = ऑपरेटर मानक एसक्यूएल नहीं है। यदि आप चाहते हैं कि आपका कोड पोर्टेबल हो (यानी, यदि आप परवाह करते हैं), तो इसके बजाय <> का उपयोग करें।

9

बस एक छोटे से adjustement जो लोग बाद में आते हैं Fors:

समानता ऑपरेटर एक unknow मूल्य उत्पन्न जब वहाँ एक अशक्त है और अज्ञात मूल्य एक झूठी व्यवहार किया जाता है। नहीं (अज्ञात) अज्ञात है

नीचे दिए गए उदाहरण में मैं यह कहने की कोशिश करूंगा कि कोई जोड़ा (ए 1, बी 1) बराबर है (ए 2, बी 2)। ध्यान दें कि प्रत्येक कॉलम में 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 

नोट हम उम्मीद करते हैं कि यहाँ के परिणाम:

  • अशक्त
  • बराबर नहीं होने के लिए समान नहीं बराबर
  • अलग

लेकिन हम प्राप्त होने के लिए विभिन्न एक और परिणाम

  • बराबर ठीक है
  • बराबर नहीं है ???
  • अलग अलग है
+0

यह सही जवाब होना चाहिए –