#sql
Всем привет. Есть таблица categories, в ней есть родительские категории, т.е. те, в которых parent_id = NULL. Почему следующий запрос возвращает 0 строк? SELECT * FROM categories WHERE parent_id = NULL
Ответы
Ответ 1
NULL - это "специальное" значение, которое по смыслу схоже с "неопределённое значение". NULL != NULL т.к. одно "неопределенное значение" не обязательно равно другому "неопределенному значению", поэтому в стандарте SQL существуют конструкции IS NULL, IS NOT NULL, COALESCE(...) и подобные им. Надо использовать IS NULL / IS NOT NULL: SELECT * FROM categories WHERE parent_id IS NULL UPDATE: "доходчивое" определение значения NULL от @Akina: Я обычно предлагаю использовать другой эквивалент: фиг знает. Тогда объяснение хотя бы становится логичным: "Равно ли первое фиг знает второму фиг знает?" или "Равно ли значение Х значению фиг знает?" (тут вместо Х подставляется число, строка, дата или переменная). Правильный ответ очевиден: а фиг знает.Ответ 2
Дополню, что в MS SQL Server есть возможность управлять этим поведением NULL в предикатах с помощью директивы SET ANSI_NULLS ON/OFF, пример: SET ANSI_NULLS OFF; IF NULL = NULL PRINT 'TRUE'; ELSE PRINT 'FALSE'; SET ANSI_NULLS ON; IF NULL = NULL PRINT 'TRUE'; ELSE PRINT 'FALSE'; =================== >TRUE >FALSE Следует учитывать, что дальнейшее использование директивы не рекомендуется: В будущей версии параметр SQL Server ANSI_NULLS всегда будет иметь значение ON, а приложения, явно присваивающие ему значение OFF, будут вызывать ошибку. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Хотя обещают это они уже не один год, угрозу свою пока что не воплотили :)
Комментариев нет:
Отправить комментарий