2008-08-11 18 views
46

Ich habe in einer WHERE-Klausel über diese gerade kommen:Prüfung auf Ungleichheit in T-SQL

AND NOT (t.id = @id) 

Wie dies mit nicht vergleichen:

AND t.id != @id 

Oder mit:

AND t.id <> @id 

Ich würde immer das letztere selbst schreiben, aber klar jemand anderes denkt anders. Wird einer besser als der andere sein? Ich weiß, dass die Verwendung von <> oder != wird jede Hoffnung für die Verwendung eines Index, die ich vielleicht gehabt hätte, aber sicherlich Büste der erste Ansatz oben wird das gleiche Problem leiden?

+1

Siehe auch: http://stackoverflow.com/questions/723195/should-i-use-or-for-not-equal-in-tsql – Dinah

Antwort

41

Diese 3 wird exakt das gleiche Ausführungsplan erhalten

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) 

Es wird auch auf die Selektivität des Index abhängen selbst natürlich. Ich benutze immer Au_id <> @id ich

+5

wie behandeln diese Klauseln nulls ? Sind sie alle gleichwertig? – FistOfFury

5

Es wird keinen Leistungseinbruch geben, beide Aussagen sind vollkommen gleich.

HTH

30

Beachten Sie, dass der Operator! = Nicht SQL-Standard ist. Wenn Sie möchten, dass Ihr Code portabel ist (wenn Sie sich interessieren), verwenden Sie stattdessen <>.

9

Nur ein wenig adjustement diejenigen, die später kommen fors:

Der Gleichheitsoperator generieren einen unknow Wert, wenn es eine Null ist und der unbekannte Wert ist ein falsch behandelt. Nicht (unbekannt) ist unbekannt

Im folgenden Beispiel versuche ich zu sagen, ob ein Paar (a1, b1) gleich (a2, b2) ist. Beachten Sie, dass jede Spalte 3 Werte 0, 1 und NULL hat.

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 

beachte hier, dass wir Ergebnisse erwarten:

  • Equal null sein
  • nicht gleich sein, nicht gleich
  • verschiedenen, unterschiedlich zu sein

aber wir bekommen ein anderes Ergebnis

  • Gleich ist Null OK
  • Nicht gleich ist null ???
  • Verschiedene unterscheidet
+0

Dies sollte die richtige Antwort sein –