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
[Ba logic Quý] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –
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'? –