Проблема полягає в тому, що NULL не вважається рівним нічому, навіть не самому собі, але дивна частина полягає в тому, що вона також не дорівнює собі.
Розглянемо наступні твердження (що BTW є незаконним у S-сервері T-SQL, але є дійсним у My-SQL, однак це ANSI визначає як null, і його можна перевірити навіть у SQL Server, використовуючи заяви справ тощо).
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Отже, немає правдивої / неправдивої відповіді на питання, натомість відповідь також є недійсною.
Це має багато наслідків, наприклад, в
- ВИПАДОК заяву, в якому будь-який порожньому значення буде завжди використовувати ELSE положення , якщо не використовувати явний вид КОЛИ умова NULL ( НЕ умова )
WHEN NULL
- З'єднання рядків, як
SELECT a + NULL -- Results in NULL
- У пункті WHERE IN чи WHERE NOT IN, як якщо ви хочете правильних результатів, переконайтеся, що у відповідному підзапиті відфільтрувати будь-які нульові значення.
Можна змінити таку поведінку в SQL Server, вказавши SET ANSI_NULLS OFF
, проте це НЕ рекомендується, і цього не слід робити, оскільки це може спричинити багато проблем, просто через відхилення від стандарту.
(Як бічна примітка, в My-SQL є можливість використовувати спеціальний оператор <=>
для порівняння з нулем.)
Для порівняння, у загальних мовах програмування нульове значення обробляється регулярним значенням і дорівнює самому собі, однак це значення NAN, яке також не є собі рівним, але принаймні повертає "помилкове", порівнюючи його з собою, (і при перевірці на нерівність різні мови програмування мають різні реалізації).
Однак зауважте, що в базових мовах (наприклад, VB тощо) немає ключового слова "null", і замість цього використовується ключове слово "Nothing", яке не можна використовувати в прямому порівнянні, і замість цього потрібно використовувати "IS", як у SQL, однак він насправді дорівнює собі (при використанні непрямих порівнянь).