Я всегда озадачен некоторым загадочным поведением t-sql, например:
-- Create table t and insert values.
use tempdb
CREATE TABLE dbo.t (a INT NULL);
-- insert 3 values
INSERT INTO dbo.t values (NULL),(0),(1);
GO
set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null
go
-- expect 3 rows returned but only 2 returned (without null value row)
select * from dbo.t where a = a
Речь идет не о том, как извлечь все строки в таблице, а также о том, как избежать использования ANSI_NULLS.
Я просто хочу выяснить, почему t-sql ведет себя так.
Роберт Шелдон в следующем посте от 2015 года обсуждает NULL-поведение и почему они иногда (но не всегда) терпят неудачу
https://www.simple-talk.com/sql/t-sql-programming/how-to-get-nulls-horribly-wrong-in-sql-server/
Он описывает 13 ошибок NULL, которые программист может легко отключить.
Ошибка № 1: не зная, что означает NULL
Объяснение: NULL - это не значение, несуществующее значение. Это не ноль. Это не пустая строка. Значение не может быть равно NULL. Нет двух значений NULL равных .
Это основная проблема, но обязательно прочитайте о других ошибках.
Да, более ранние версии (я полагаю, до SQL Server 7) вели себя по-другому, больше как то, что вы хотите.
Однако, если вы будете искать проблему в Stack Overflow и Stack Exchange, вы обнаружите много длинных потоков, обсуждающих проблемы.
источник
WHERE NULL = NULL
дает значение true, когда параметр имеет значение.Чтобы добавить к обсуждению, определение NULL в стандарте SQL92 можно интерпретировать неоднозначно. Вот хорошее резюме обработки и интерпретации NULL из различных СУБД, предоставленных sqlite.org.
РАСКРЫТИЕ ИНФОРМАЦИИ : Я помню, что читал о «неоднозначности» SQL92 из более старой версии (например, 6-8 лет назад) страницы sqlite.org, указанной выше, но с тех пор эта страница была обновлена.
Ответ RLF выше имеет хорошую цитату, но если я не согласен с Робертом Шелдоном, то это только потому, что я считаю, что «что-то, что не существует» (то есть NULL ), философски и семантически эквивалентно английскому языку «что - то еще, что не существует». ». Если я хочу понять логику Шелдона, то можно было бы объявить определение NULL также NULL. (Если его не существует, то как мы можем его определить? Жутко, да?)
Я вижу вариацию назревающего парадокса Рассела ( и головную боль). : - \
Но опять же, это обсуждение семантики английского языка ( НЕ SQL), и философские дебаты здесь . :-)
источник