Что показывает значение null
Работа с NULL-значениями
NULL-значение
Достаточно часто встречаются такие случаи, когда в таблице имеются записи с не заданными значениями какого-либо из полей, потому что значение поля неизвестно или его просто нет. В таких случаях SQL позволяет указать в поле NULL-значение. Строго говоря, NULL-значение вовсе не представлено в поле. Когда значение поля есть NULL — это значит, что программа базы данных специальным образом помечает поле, как не содержащее какого-либо значения для данной строки (записи). Дело обстоит не так в случае простого приписывания полю значения «нуль» или «пробел», которые база данных трактует как любое другое значение. Поскольку NULL не является значением как таковым, он не имеет типа данных. NULL может размещаться в поле любого типа. Тем не менее, NULL, как NULL-значение, часто используется в SQL.
Предположим, появился покупатель, которому еще не назначен продавец. Чтобы констатировать этот факт, нужно ввести значение NULL в поле snum, а реальное значение включить туда позже, когда данному покупателю будет назначен продавец.
IS NULL
Поскольку NULL фиксирует пропущенные значения, результат любого сравнения при наличии NULL-значений неизвестен. Когда NULL-значение сравнивается с любым значением, даже с NULL-значением, результат просто неизвестен. Булево значение «неизвестно» ведет себя также, как «ложь» — строка, на которой предикат принимает значение «неизвестно», не включается в результат запроса – при одном важном исключении: NOT от лжи есть истина (NOT (false)=true), тогда как NOT от неизвестного значения есть также неизвестное значение. Следовательно, такое выражение как «city = NULL» или «city IN (NULL)» является неизвестным независимо от значения city.
Часто необходимо различать false и unknown – строки, содержащие значения столбца, не удовлетворяющие предикату, и строки, которые содержат NULL. Для этой цели SQL располагает специальным оператором IS, который используется с ключевым словом NULL для локализации NULL-значения.
SQL IS NULL. Пример.
Вывести все поля из талицы Customers, значения поля city которых равны NULL:
SELECT * FROM Customers WHERE city IS NULL
В данном случае выходных данных не будет, поскольку в поле city нет NULL-значений.
IS NOT NULL
Условие IS NOT NULL используется в запросах для выборки записей со значениями не равных значению NULL
SQL IS NOT NULL. Пример.
Вывести все поля из талицы Customers, значения поля city которых НЕ равны NULL:
SELECT * FROM Customers WHERE city IS NOT NULL
Все о null в JavaScript
Как вы уже, наверное, знаете в языке JavaScript реализовано две большие группы типов данных: примитивы (строки, логические значения, числа, символы) и объекты.
Объекты — это сложные структуры данных. Самым простым объектом в JavaScript является объект представляющий собой набор ключей и соответствующих им значений:
1. Концепция null
Спецификация JavaScript говорит следующее о null :
null — примитивное значение, которое представляет намеренное отсутствие какого-либо значения типа объект.
Таким образом, если вы замечаете, что значение null было присвоено переменной или возвращается функцией, то этим значением, в общем случае, должен быть объект, но по какой-то причине он не был создан.
1.1 Аналогия null из реального мира
Думая об аналогии с реальным миром, вы можете представить себе переменную как коробку. Точно так же, как переменная может содержать объект, коробка может содержать некоторые предметы, например, чайник.
2. Проверка значения переменной на null
Хороший способ проверить содержит ли значение какой-либо переменной null — использовать оператор строгого равенства :
2.1 null — это ложное значение (false)
2.2 Тип null
3. Ловушка null
Давайте снова воспользуемся функцией greetObject() и попробуем получить доступ к свойству message у возвращенного объекта:
Обычно для того, чтобы избежать такого эффекта используются два альтернативных варианта, которые мы рассмотрим в следующем разделе.
4. Альтернативы использованию null
И хотя очень заманчиво возвращать значение null в том случае, если вы не можете по той или иной причине создать объект, но у этой практики есть существенные недостатки.
Как только значение null появляется в вашем стеке выполнения, то вы обязательно должны проверять его присутствие.
Либо возбуждать исключение с выводом соответствующего сообщения об ошибке:
Рассмотренные практики написания кода позволяют вам не использовать null вообще, и избежать проблем с отладкой и сопровождением вашего кода в будущем.
5. null vs undefined
undefined — соответствует значению неинициализированной переменной или свойства объекта.
Например, если вы объявляете переменную без присвоения начального значения, то результатом операции доступа к ее значению переменной будет undefined :
Основное различие между null и undefined заключается в том, что значение null интерпретируется как отсутствие в качестве значения некоторого объекта, а — undefined как неинициализированное состояние переменной или возвращаемого значения.
Использование оператора строгого равенства позволяет === позволяет различать значения null и undefined :
В то время как оператор нестрогого равенства == определяет, что null и undefined эквивалентны:
Использование оператора нестрого равенства для проверки, содержит ли переменная null или undefined приведет к получению следующего результата:
6. Заключение
null — специальное значение, реализованное в языке JavaScript, которое соответствует отсутствию объекта, который ожидается в качестве значения переменной или должен возвращаться функцией.
Значения null и undefined в какой-то степени эквивалентны, тем не менее, null представляют собой отсутствующее значение типа объект, а undefined неинициализированное состояние переменной или значения возвращаемого функцией.
NULL и UNKNOWN (Transact-SQL)
NULL указывает на то, что значение неизвестно. NULL отличается от пустого или нулевого значения. Два значения NULL считаются эквивалентными. Сравнения между двумя значениями NULL или между значением NULL и каким-либо иным значением возвращают неизвестную величину, так как значение каждого из значений NULL неизвестно.
Значение NULL обычно указывает на то, что данные неизвестны, неприменимы или будут добавлены позже. Например, на момент размещения клиентом заказа может быть неизвестно его отчество.
Обратите внимание на следующие особенности значений NULL:
для проверки наличия значения NULL в предложении WHERE запроса используются ключевые слова IS NULL или IS NOT NULL;
значения NULL могут появиться в столбце явным указанием значения NULL в инструкции INSERT или UPDATE или пропуском указания столбца в инструкции INSERT;
значения NULL не могут применяться в тех случаях, когда необходимо отличать одну строку таблицы от другой, например в качестве первичного или внешнего ключа, или распределять строки, например в качестве ключа распределения.
Если в данных присутствуют значения NULL, логические операторы и операторы сравнения могут возвращать, кроме TRUE или FALSE, также и третий результат — UNKNOWN. Эта тройственная логика является источником многих проблем в приложениях. Логические операторы в логическом выражении, включающие значения UNKNOWN, будут возвращать UNKNOWN, за исключением случаев, когда результат оператора не зависит от выражения UNKNOWN. В таблицах содержатся примеры такого поведения.
В следующей таблице показаны результаты применения оператора AND к двум логическим выражениям, когда одно выражение возвращает UNKNOWN.
Выражение 1 | Выражение 2 | Результат |
---|---|---|
true | UNKNOWN | UNKNOWN |
UNKNOWN | UNKNOWN | UNKNOWN |
FALSE | UNKNOWN | FALSE |
В следующей таблице показаны результаты применения оператора OR к двум логическим выражениям, когда одно выражение возвращает UNKNOWN.
SQL Значение NULL
Что такое значение NULL?
Если поле в таблице является необязательным, то можно вставить новую запись или обновить запись без добавления значения в это поле. Затем поле будет сохранено с значением NULL.
Как проверить наличие NULL значений?
Вместо этого нам придется использовать оператор IS NULL и IS NOT NULL.
Синтаксис IS NULL
Синтаксис IS NOT NULL
Демо база данных
Ниже приведен выбор из таблицы «Customers» в образце базы данных Northwind:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 |
Оператор IS NULL
Оператор IS NULL используется для проверки пустых значений (NULL).
В следующем SQL файле перечислены все клиенты с значением NULL в поле «Address»:
Пример
Совет: Всегда используйте значение NULL для поиска значений NULL.
Оператор IS NOT NULL
Оператор IS NOT NULL используется для проверки непустых значений (NOT NULL).
В следующем SQL файле перечислены все клиенты со значением в поле «Address»:
Null, великий и ужасный
Именно так и никак иначе: null в C# — однозначно ошибочное решение, бездумно скопированное из более ранних языков.
Этот ящик Пандоры был открыт еще при создании языка ALGOL W великим Хоаром, который позднее назвал собственную идею ошибкой на миллиард долларов.
Лучшая историческая альтернатива
Разумеется, она была, причем очевидная по современным меркам
Самое трагичное, что все это не было откровением и даже новинкой уже к моменту проектирования первой версии языка. Увы, тогда матерых функциональщиков в команде Хейлсберга не было.
Лекарства для текущей реальности
Хотя прогноз очень серьезный, летального исхода можно избежать за счет применения различных практик и инструментов. Способы и их особенности пронумерованы для удобства ссылок.
Явные проверки на null в операторе if. Очень прямолинейный способ с массой серьезных недостатков.
Атрибут NotNull. Немного упрощает использование явных проверок
Паттерн проектирования Null object. Очень хороший способ, но с ограниченной сферой применения.
Конвенция о возврате живых объектов по умолчанию. Очень просто и эффективно.
Любой метод или свойство, для которых явно не заявлена возможность возвращать null, должны всегда предоставлять полноценный объект. Для поддержания достаточно выработки хорошей привычки, например, посредством ревью кода.
Конвенция о стандартных способах явно указать что свойство или метод может вернуть null: например, префикс Try или суффикс OrDefault в имени метода. Органичное дополнение к возврату полноценных объектов по умолчанию. Достоинства и недостатки те же.
Атрибут CanBeNull. Добрый антипод-близнец атрибута NotNull.
Операторы C# (тернарный, Элвиса, coalesce)
Тип Optional. Позволяет явно поддержать отсутствие объекта.
Монада Maybe. LINQ для удобной обработки случаев как наличия, так и отсутствия объекта.
Пакет Fody/NullGuard. Автоматические проверки на null на стероидах.
Ссылочные типы без возможности присвоения null (если добавят в одну из будущих версий C#)
Итоги
Буду краток — все выводы в таблице:
Настоятельная рекомендация | Антипаттерн | На ваш вкус и потребности |
---|---|---|
4, 5, 7, 11, 12 (когда и если будет реализовано) | 1, 2 | 3, 6, 8, 9, 10 |
На предвосхищение ООП через 20 лет не претендую, но дополнениям и критике буду очень рад.
Обновление
добавил примеры кода к утопической альтернативе.