2008-08-11 17 views
46

Ben sadece bir WHERE yan tümcesinde bu rastlamak ettik:Test T-SQL eşitsizlik için

AND t.id != @id 

Veya ile:

AND NOT (t.id = @id) 

Bu nasıl farklı olan yönleri nelerdir

AND t.id <> @id 

Her zaman kendimi yazarım, ama açıkça başka biri farklı düşünüyor. Biri diğerinden daha iyi performans gösterecek mi? <> veya !='u kullanarak, sahip olduğum bir endeksi kullanmak için herhangi bir ümit vermeyeceğimi biliyorum, ancak kesinlikle Yukarıdaki ilk yaklaşım aynı problemi yaşayacaktır?

+1

Ayrıca bkz: http://stackoverflow.com/questions/723195/should-i-use-or-for-not-equal-in-tsql – Dinah

cevap

41

Bu 3 Ayrıca elbette indeksi kendisinin seçicilik bağlı olacaktır aynı kesin yürütme planını

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) 

alacak. Orada boş ve bilinmeyen değer sahte muamele edildiğinde

eşitlik operatörü bilinmeyen değer oluşturmak: Hep au_id kullanmak <> kendim

+5

bunların nasıl hükümler boş değerlere davranıyorsunuz ? Hepsi eşdeğer mi? – FistOfFury

5

Hiçbir performans isabeti olmaz, her iki deyim de mükemmel olarak eşittir. ! = Operatör standart bir SQL olmadığını

HTH

30

Not. Kodunuzun taşınabilir olmasını istiyorsanız (diğer bir deyişle, bakım yapıyorsanız), bunun yerine <> kullanın.

9

Sadece küçük AYARI sonra gelenlerden fors @id. (bilinmeyen) bilinmeyen

Aşağıdaki örnekte, bir çiftin (a1, b1) (a2, b2) değerine eşit olup olmadığını anlamaya çalışacağım. Her sütunda 0, 1 ve NULL değerlerinin 3 olduğunu unutmayın.

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 

Not bekliyoruz burada o sonuçlar:

  • olmak
  • eşit değildir sıfır olması Eşit olmayan eşit

ancak tanıtım farklı olmak farklı başka bir sonuç

  • Eşittir null
  • Not Equal is null ??? Farklı
  • farklıdır
+0

Doğru cevap bu olmalı –