Trong bảng của tôi, tôi có một cột bitable (hệ thống kế thừa ...) và một nhà phát triển khác gần đây đã thực hiện thay đổi đối với một thủ tục được lưu trữ để chỉ hiển thị các giá trị trong đó cột bit không đúng (1). Bởi vì đây là một cột nullable, chúng tôi nhận thấy rằng nếu cột là NULL, hồ sơ đã không được chọn. TẠI SAO?SQL: Tại sao giá trị NULL được lọc ra trong mệnh đề where?
Cả nhà phát triển khác và tôi đồng ý rằng NULL <> 1 ... Đây có phải là lỗi trong SQL hoặc được thiết kế theo cách này không? Có vẻ như một lỗ hổng thiết kế.
Mã hiện tại:
(VoidedIndicator <> 1)
Đề xuất Fix:
(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)
Làm rõ (Theo Jon Erickson)
VoidedIndicator là một lĩnh vực chút nullable để nó có thể có các giá trị sau: NULL, 0, o r 1
Khi câu lệnh SQL được tạo với mệnh đề where (VoidedIndicator <> 1), chúng tôi chỉ nhận được các bản ghi trả về có VoidedIndicator == 0, nhưng chúng tôi mong đợi cả VoidedIndicator == 0 và VoidedIndicator IS NULL. Tại sao điều này?
Vì vậy, nếu NULL không bằng bất kỳ thứ gì bạn nói, thì NULL không được bao gồm trong trường hợp này như thế nào? Cột <> 1 ... NULL không bằng 1? Chính xác? – RSolberg
Bất kỳ so sánh nào liên quan đến trả về NULL sai vì vậy có NULL <> 1 là sai. Đó là những gì IS NULL hoặc IS NOT NULL là cho. – cletus
Cách tốt nhất mà tôi tìm thấy để suy nghĩ về null trong thuật ngữ cơ sở dữ liệu, đúng hay sai, là giá trị null là "không xác định", do đó không thể so sánh với giá trị null khác, cũng không so sánh với giá trị cụ thể –