Почему NULL не распространяется в логическом выражении в SQL? - PullRequest
0 голосов
/ 17 апреля 2020

В SQL каждая операция, которая включает операнд с NULL, приводит к NULL (с ​​очевидными исключениями операторов IS NULL или IS NOT NULL). Однако NULL не распространяется с операторами И или ИЛИ, которые могут возвращать ИСТИНА или ЛОЖЬ. Например, следующее в MariaDB 10.4 возвращает NULL и 0 соответственно:

select 0 & null, 0 and null

Разница в том, что первое - это битовое И, а второе - логическое И. Почему NULL не распространяется в логической операции?

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

У нас есть 0 and null. В MariaDB 0 и FALSE являются синонимами. Итак, у нас есть FALSE AND NULL. Но FALSE AND <anything> всегда FALSE - нет сомнений, что независимо от того, какое значение здесь может быть подставлено, ничто не может сделать это утверждение TRUE сейчас.

Поэтому мы закорачиваем и возвращаем FALSE / 0 результат. Аналогично, 1 OR NULL должен вернуть 1.

0 голосов
/ 17 апреля 2020

NULL имеет семантику "неизвестного" значения. У него нет семантики "пропущенных". Это нюанс.

Но он "распространяется" AND и OR, совсем не так, как вы могли ожидать. Итак:

true AND NULL   --> NULL, because the value would depend on what NULL is
false AND NULL  --> false, because the first value requires that the result is false

В предложениях WHERE и WHEN, NULL рассматривается как "ложный". Однако в ограничениях CHECK NULL обрабатывается как "истина", то есть только явно ложные значения не соответствуют ограничению NULL.

В противном случае вы правы что почти все операции с NULL возвращают NULL. Оператор & является побитовым оператором, который не имеет ничего общего с логическими значениями. Это просто еще один «математический» оператор, такой как + или *, поэтому значение равно NULL, когда любой операнд равен NULL.

Одним очень важным исключением является NULL оператор безопасного сравнения, <=>.

0 голосов
/ 17 апреля 2020

Значение NULL имеет целый ряд возможных значений. IIR C Крис Дэйт нашел около 7 различных интерпретаций.

Очень распространенная интерпретация NULL: «Я не знаю». Другой вариант: «Не применимо».

Итак, давайте попробуем оценить условие с помощью интерпретации «Я не знаю» значения NULL. В качестве примера предположим, что есть два человека. И вы хотите сравнить их возраст. Человеку А бывает 31 год. В случае другого человека, лица B, вы не знаете.

На вопрос, является ли A столь же старым, как B, нельзя ответить положительно. Но это также нельзя отрицать. На самом деле, вы не знаете. Следовательно, значение истинности здесь равно NULL.

Если мы добавим возраст обоих людей, мы столкнемся с одной и той же проблемой. Мы не имеем понятия о сумме их возраста. Опять же, полученное значение равно NULL.

Вот почему вам придется определить, как обрабатывать значения NULL. Система баз данных не может этого знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...