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 NULL
và IS 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 ISNULL
là COALESCE
.
Nguồn
2012-03-24 02:26:31
Để 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' –