Testarea inegalității în T-SQL

Tocmai am întâlnit acest lucru într-o clauză WHERE:

AND NOT (t.id = @id)

Cum se compară aceasta cu:

AND t.id != @id

Sau cu:

AND t.id <> @id

I'd always write the latter myself, but clearly someone else thinks differently. Is one going to perform any better than the other? I know that using <> or != is going to bust any hopes for using an index that I might have had, but surely the first approach above will suffer the same problem?

0
fr hi bn

4 răspunsuri

Nu va fi nici un hit de performanță, ambele declarații sunt perfect egale.

HTH

0
adăugat

Aceste 3 vor primi același plan de execuție exactă

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)

It will also depend on the selectivity of the index itself of course. I always use au_id <> @id myself

0
adăugat
cum pot trata aceste clauze null? Sunt toți echivalenți?
adăugat autor FistOfFury, sursa

Note that the != operator is not standard SQL. If you want your code to be portable (that is, if you care), use <> instead.

0
adăugat

Doar puțină adaptare îi solicită pe cei care vin mai târziu:

Operatorul de egalitate generează o valoare necunoscută atunci când există o nulă iar valoarea necunoscută este tratată ca fiind falsă. Nu (necunoscut) este necunoscut

În exemplul de mai jos, voi încerca să spun dacă un cuplu (a1, b1) este egal cu (a2, b2). Rețineți că fiecare coloană are 3 valori 0, 1 și 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

Rețineți că aici așteptăm rezultatele:

  • Egal să fie null
  • nu este egal să nu fie egal
  • diferit de diferent

dar obținem un alt rezultat

  • Egal este OK null
  • Nu este egal nulă
  • Diferitele sunt diferite
0
adăugat
Acesta ar trebui să fie răspunsul corect
adăugat autor Jamie Strauss, sursa