2011-06-29 28 views
8

Trong SQL microsoft, tôi có báo cáo kết quả sau (khoảng):Làm thế nào để bạn nhận được SQL để nhận ra WHERE column = NULL?

UPDATE sometable 
    SET somecolumn = @somevalue 
WHERE somecolumn = NULL; 

@somevalue được thiết lập trước đó trong kịch bản.

Điều này chạy tốt và SQL cho tôi biết không có hàng nào bị ảnh hưởng. Có năm hàng là somecolumn là NULL. Tôi đang làm gì sai?

+1

Để trả lời câu hỏi trong tiêu đề, bạn sẽ sử dụng 'SET ANSI_NULLS OFF'. Tùy chọn này là (chính xác) không được chấp nhận mặc dù và bạn chỉ nên sử dụng 'IS NULL' –

Trả lời

17

Bạn phải sử dụng IS NULL để kiểm tra giá trị NULL trong cột.

UPDATE sometable SET somecolumn = @somevalue WHERE somecolumn IS NULL; 
+0

Ha, lỗi newbie ... cảm ơn bạn! – Peter

+2

Giá trị NULL không thể bằng bất kỳ giá trị nào ngay cả với NULL khác. – acermate433s

+5

@Peter: NULL không phải là một giá trị - đó là một trình giữ chỗ cho * thiếu bất kỳ giá trị nào * –

3

Joe là đúng. Không có gì có thể EQUAL null. Nó chỉ có thể là null, do đó, UPDATE mytable SET mycolumn = @value WHERE anotherColumn IS NULL.

+0

Không gì có thể bằng null khi nói đến việc mắc lỗi với SQL. – onedaywhen

1

ANSI SQL defines NULL không bằng bất cứ thứ gì - thậm chí một phiên bản khác của NULL. Cách kinh điển xung quanh đó là sử dụng IS NULLIS NOT NULL.

Ngoài ra còn có tùy chọn MS SQL Server SET ANSI_NULLS. Tắt tùy chọn này có tác dụng có WHERE x = NULL thực hiện chính xác những gì bạn mong đợi. Tuy nhiên, nó cũng sẽ bao gồm bất kỳ giá trị NULL nào trong truy vấn như WHERE x <> 'abc' - có thể không phải là những gì bạn mong đợi. Tùy chọn này là kết nối cụ thể, vì vậy việc thay đổi nó cho kết nối của bạn sẽ không ảnh hưởng đến người khác. Bạn cũng có thể đặt cài đặt mặc định ở cấp cơ sở dữ liệu. Khi tạo thủ tục được lưu trữ, tùy chọn được chụp tại thời gian tạo - không phải thời gian chạy.

Bí quyết khác là tạo truy vấn như WHERE ISNULL(x, '') = ISNULL(@x, ''). Tôi không nghĩ rằng đó là SARGable, vì vậy hiệu suất không tốt bằng WHERE (x IS NULL AND @x IS NULL) OR (x = @x), nhưng nó đẹp hơn rất nhiều để viết và tự động xây dựng.

Ồ - và vì chúng ta đang nói ANSI SQL. Phiên bản ANSI SQL của ISNULLCOALESCE.

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