2012-01-25 38 views
5

Tôi vừa gặp một vấn đề thú vị với một thủ tục tôi đang viết bằng SQL. Trong proc của tôi, tôi có 2 ngày, đó là tham số tùy chọn mặc định là NULL, tôi muốn kiểm tra nếu các tham số này không phải là null và nếu không chạy một phần của proc của tôi, nếu chúng là null thì phần bổ sung của proc bị bỏ qua. Tôi đã làm một tuyên bố khá cơ bản IF(@dateVariable <> NULL AND @DateVariable2 <> NULL), nhưng tuyên bố nếu không bao giờ hoạt động ngay cả khi các biến không phải là null, tôi sẽ giả định SQL đang đấu tranh để so sánh ngày với một NULL là lạ kể từ datetime là nullable.Tại sao so sánh biến ngày SQL với null hoạt động theo cách này?

Để giải quyết vấn đề này, tôi chỉ thực hiện IF(DateVariable IS NOT NULL) hoạt động chính xác. Vì vậy, câu hỏi của tôi là tại sao IF đầu tiên không hoạt động, nhưng IF thứ hai và thứ ba đều làm vì cả hai phải tại một số điểm so sánh nội dung của biến để null?

Ví dụ:

----- Thất bại -----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date <> NULL) 
BEGIN 
    print('a') 
END 

----- Làm việc -----

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (ISNULL(@Date,'') <> '') 
BEGIN 
    print('a') 
END 

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date IS NOT NULL) 
BEGIN 
    print('a') 
END 
+3

[Ba logic Quý] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –

+0

Hãy suy nghĩ về 'NULL' là' Giá trị chưa biết'. Giá trị '@Date = Chưa biết Giá trị chưa biết' sẽ như thế nào? 'True'? 'Sai'? Hoặc 'Chúng ta không biết'? –

Trả lời

13

Đơn giản chỉ cần đặt 'NULL 'không bằng' NULL '. 'NULL' có thể so sánh với trạng thái không chắc chắn, trong đó một điều không chắc chắn không nhất thiết phải bằng một cái gì đó khác cũng không chắc chắn. Sử dụng 'IS NULL', 'ISNULL()' hoặc 'COALESCE()' khi kiểm tra các giá trị rỗng. Đặt ANSI_NULLS thành 'off' có thể thay đổi hành vi này, nhưng nó không phải là tiêu chuẩn SQL ANSI. Xem http://msdn.microsoft.com/en-us/library/ms191270.aspx để biết thêm thông tin.

4

Việc chăm sóc phải được thực hiện khi so sánh giá trị null. Hành vi của việc so sánh phụ thuộc vào cài đặt của tùy chọn SET ANSI_NULLS.

Khi SET ANSI_NULLS được BẬT, so sánh trong đó một hoặc nhiều biểu thức là NULL không mang lại TRUE hoặc FALSE; nó mang lại UNKNOWN. Điều này là do một giá trị không xác định không thể được so sánh một cách hợp lý so với bất kỳ giá trị nào khác. Điều này xảy ra nếu một biểu thức được so sánh với NULL bằng chữ, hoặc nếu hai biểu thức được so sánh và một trong số chúng được đánh giá là NULL.

Xem NULL Comparison Search Conditions

+2

'SET ANSI_NULLS OFF' không được chấp nhận. http://msdn.microsoft.com/en-us/library/ms143729.aspx –

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