2008-08-11 34 views
46

acabo de venir a través de esta en una cláusula WHERE:Las pruebas para la desigualdad en T-SQL

AND NOT (t.id = @id) 

¿Cómo se compara esto con:

AND t.id != @id 

O con:

AND t.id <> @id 

Yo siempre escribiría este último yo mismo, pero es evidente que alguien más piensa de manera diferente. ¿Va a funcionar uno mejor que el otro? Sé que el uso de <> o != va a reventar cualquier esperanza de usar un índice que podría haber tenido, pero seguramente el primer acercamiento anterior sufrirá el mismo problema?

+1

Ver también: http://stackoverflow.com/questions/723195/should-i-use-or-for-not-equal-in-tsql – Dinah

Respuesta

41

Estos 3 obtendrá el mismo plan de ejecución exacta

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) 

También dependerá de la selectividad del propio índice, por supuesto. Siempre uso au_id <> @Id mismo

+5

¿cómo tratar estas cláusulas nulos ? ¿Son todos equivalentes? – FistOfFury

5

No habrá golpe de rendimiento, ambas declaraciones son perfectamente iguales.

HTH

30

Tenga en cuenta que el operador! = No es SQL estándar. Si desea que su código sea portátil (es decir, si le importa), use <>.

9

Sólo un poco adjustement Fors los que vienen después:

El operador de igualdad generar un valor desconocido cuando hay un nulo y el valor desconocido se trata de una falsa. No (desconocido) se desconoce

En el siguiente ejemplo intentaré decir si un par (a1, b1) es igual a (a2, b2). Tenga en cuenta que cada columna tiene 3 valores 0, 1 y NULL.

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 

Tenga en cuenta que aquí esperamos resultados:

  • Igual a ser nula
  • no es igual a no ser igual
  • diferente a ser diferente

pero obtenemos otro resultado

  • Igual es nulo OK
  • Not Equal is null ???
  • Diferente es diferente
+0

Esta debería ser la respuesta correcta –

Cuestiones relacionadas