Vấn đề là NULL mà không được coi là tương đương với bất cứ điều gì thậm chí không để bản thân, nhưng phần lạ là cũng là không phải là bằng chính nó. Xem xét các báo cáo sau (là BTW bất hợp pháp trong SQL Server T-SQL nhưng hợp lệ trong My-SQL, tuy nhiên đây là những gì ANSI định nghĩa cho null, và có thể được xác minh ngay cả trong SQL Server bằng cách sử dụng báo cáo trường hợp, v.v.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Vì vậy, không có/câu trả lời đúng sai cho câu hỏi, thay vì câu trả lời cũng là null.
này có nhiều ý nghĩa, ví dụ như trong
- báo cáo CASE, trong đó bất kỳ giá trị null sẽ luôn luôn sử dụng các mệnh đề ELSE trừ khi bạn sử dụng một cách rõ ràng tình trạng NULL KHI LÀ (KHÔNG điều kiện
WHEN NULL
)
- string nối, như
SELECT a + NULL -- Results in NULL
- Trong một ĐÂU TRÊN hoặc ĐÂU KHÔNG TRONG khoản, như nếu bạn muốn kết quả chính xác đảm bảo trong truy vấn con tương quan để lọc ra bất kỳ giá trị null nào.
Người ta có thể ghi đè lên hành vi này trong SQL Server bằng cách xác định SET ANSI_NULLS OFF
, tuy nhiên điều này là KHÔNG đề nghị và không nên được thực hiện vì nó có thể gây ra nhiều vấn đề, đơn giản chỉ vì độ lệch tiêu chuẩn.
(Như một mặt lưu ý, trong My-SQL có một tùy chọn để sử dụng một nhà điều hành đặc biệt <=>
để so sánh null.)
Trong khi đó, trong ngôn ngữ lập trình nói chung null được coi là một giá trị thường xuyên và tương đương cho chính nó, tuy nhiên giá trị NAN cũng không bằng với chính nó, nhưng ít nhất nó trả về 'false' khi so sánh nó với chính nó, và khi kiểm tra không bằng các ngôn ngữ lập trình khác nhau có các cách triển khai khác nhau.Tuy nhiên, hãy lưu ý rằng trong ngôn ngữ cơ bản (ví dụ VB, v.v.) không có từ khóa 'null' và thay vào đó, từ khóa 'Không', không thể sử dụng trong so sánh trực tiếp và thay vào đó cần sử dụng 'IS' như trong SQL, tuy nhiên trên thực tế nó bằng với chính nó (khi sử dụng các so sánh gián tiếp).
Nguồn
2015-04-16 01:01:57
@ đề xuất COALESCE của Luther tốt hơn câu trả lời của tôi. Đó là hiệu quả ít hơn, nhưng thanh lịch hơn nhiều. –
Xử lý nó với một cái gì đó như thế này có thể được sử dụng, hoặc một cái gì đó giống như: COALESCE (last_name, '') Tuyên bố trường hợp, trong khi ngắn gọn, là ít bảo trì hơn COALESCE trong truy vấn lớn. Cuối cùng, bạn có kết quả tương tự. Nếu bạn cần tối ưu hóa, kiểm tra các kế hoạch thực hiện nhưng tôi đã không nhận thấy nhiều sự khác biệt. –
'COALESCE' về cơ bản được dịch nội bộ thành' CASE'. Vấn đề với CASE là 'last_name' được đánh giá hai lần và nó có thể dẫn đến các tác dụng phụ khác - xem [article] tuyệt vời này (http://sqlmag.com/t-sql/coalesce-vs-isnull). Để giải quyết những gì đã được hỏi, tôi thà đi với 'ISNULL ('' + last_name, '')' được đề cập trong [bình luận] (http://stackoverflow.com/questions/3237646/t-sql-case-clause-how -to-specify-when-null # comment3343348_3237704) bên dưới. – miroxlav