Vì vậy, về cơ bản trong SQL Server, NULL có nghĩa là không có giá trị và do đó không thể so sánh được sẽ trả về một số kết quả không mong muốn.
Ví dụ: truy vấn sau không trả về các hàng trong đó giá trị IS NULL nhưng tôi muốn nó:
SELECT *
FROM table
WHERE
(value != 26)
AND date IS NULL
AND last_modified >= '5/21/2014'
Tôi hiểu tôi có thể làm như sau một cách giải quyết nhưng nghiêm túc? Phải thêm dấu ngoặc đơn và kiểm tra xem có phải là null cho mỗi trường đơn lẻ mỗi lần tôi muốn đưa nó vào không? Có vẻ xấu xí, không trực quan và điên rồ.
SELECT *
FROM table
WHERE
(value != 26 OR value is null)
AND date IS NULL
AND last_modified >= '5/21/2014'
Ý tôi là tôi biết NULL không phải là một giá trị và do đó không thể so sánh được nhưng bạn không thể suy luận rằng trên thực tế, chắc chắn không phải 26? Nếu 26 là một cái gì đó và NULL không là gì và không có gì không phải là một cái gì đó thì NULL không phải là 26. Có vẻ hợp lý với tôi.
Có ai biết làm thế nào tôi có thể, theo cách sạch hơn, bao gồm null trong kết quả của tôi khi sử dụng so sánh mà không phải bao gồm kiểm tra rõ ràng mỗi lần. Ngoài ra, tắt null trên bàn của tôi chắc chắn không phải là một lựa chọn.
Biên tập:
Vấn đề thực sự của tôi về lý do tại sao tôi không muốn làm theo cách tôi thể hiện không bị lộ. Vì vậy, ở đây đi. Tôi đang viết một chương trình cho phép bạn xây dựng các truy vấn vào các bảng cơ sở dữ liệu và để người dùng tự động tạo các bộ lọc và về cơ bản vào cuối ngày sẽ xây dựng một câu lệnh SQL và hiển thị kết quả cho người dùng. Các trường được người dùng chọn có thể là bất kỳ và / hoặc tất cả các trường trong cơ sở dữ liệu nhất định và nếu tôi phải đặt ISNULL theo nghĩa đen trên mọi trường duy nhất thực sự không hiệu quả và làm cho SQL trở nên cực kỳ xấu. Chương trình của tôi là định nghĩa không xác định bảng có nghĩa là tôi không quan tâm những gì trong bảng của bạn và không muốn biết định nghĩa của bảng là gì. Tôi chỉ muốn bạn chọn một bảng, chọn một số trường để lọc với bằng, không bằng, trong, không trong, v.v ...