2008-08-11 47 views
46

Tôi vừa mới đi qua này trong mệnh đề WHERE:kiểm tra cho sự bất bình đẳng trong T-SQL

AND NOT (t.id = @id) 

như thế nào này so sánh với:

AND t.id != @id 

Hoặc với:

AND t.id <> @id 

Tôi luôn tự viết bản thân mình, nhưng rõ ràng người khác lại nghĩ khác. Là một trong những sẽ thực hiện bất kỳ tốt hơn so với khác? Tôi biết rằng việc sử dụng <> hoặc != sẽ phá vỡ bất kỳ hy vọng nào về việc sử dụng chỉ mục mà tôi có thể có, nhưng chắc chắn cách tiếp cận đầu tiên ở trên sẽ gặp phải vấn đề tương tự?

+1

Xem thêm: http://stackoverflow.com/questions/723195/should-i-use-or-for-not-equal-in-tsql – Dinah

Trả lời

41

Những 3 sẽ nhận được cùng một kế hoạch thực hiện chính xác

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) 

Nó cũng sẽ phụ thuộc vào chọn lọc của các chỉ số chính của khóa học. Tôi luôn luôn sử dụng au_id <> @ id bản thân mình

+5

làm thế nào để các điều khoản này trị null ? Tất cả chúng có tương đương không? – FistOfFury

5

Sẽ không có lần truy cập hiệu suất, cả hai câu lệnh đều hoàn toàn bằng nhau.

HTH

30

Lưu ý rằng toán tử! = Không phải là SQL chuẩn. Nếu bạn muốn mã của mình có thể di chuyển được (tức là, nếu bạn quan tâm), hãy sử dụng <> để thay thế.

9

Chỉ cần một chút adjustement Fors những người đến sau:

Nhà điều hành bình đẳng tạo ra một giá trị unknow khi có một null và giá trị chưa biết được điều trị một sai lầm. Không (không xác định) là không rõ

Trong ví dụ bên dưới, tôi sẽ cố gắng nói nếu một cặp vợ chồng (a1, b1) bằng (a2, b2). Lưu ý rằng mỗi cột có 3 giá trị 0, 1 và 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 

Lưu ý rằng ở đây chúng tôi mong đợi kết quả:

  • Bằng được null
  • không bằng được không bằng
  • khác nhau là khác nhau

nhưng chúng tôi nhận một kết quả khác

  • Bằng không là OK
  • Không bằng null ???
  • khác nhau là khác nhau
+0

Đây phải là câu trả lời đúng –

Các vấn đề liên quan