Стандартный SQL-оператор boolean Оператор IS против оператора equals (=)

На странице Wikipedia для SQL есть несколько таблиц истинности о логической логике в SQL. [1] На странице Википедии есть источник SQL: 2003.

Таблица истинности оператора equals (=) отличается от оператора IS от проекта SQL: 2003.

Кроме того, статья Википедии отмечает, что "IS NULL" (< null предикат > ) является частным случаем.

В SQL: 2003 кажется, что существует "IS", который является регулярным оператором типа AND, NOT и OR. Однако предикат < null не существует.

Почему существует предикат < null, когда IS является регулярным булевым оператором? Следует ли убедиться, что вы можете использовать конструкцию "IS NULL" с небулевыми значениями без когерентности типа? Не рекомендуется ли использовать "= NULL"?

Работает ли стандарт SQL: 2011 по-разному?

[1]: Википедия на SQL

[2]: SQL: проект 2011 года PDF стр. 335

[3]: Проект SQL: 2003 PDF стр. 397

Ответ 1

Это новый для меня.

Если я правильно прочитал, то грамматика <boolean value expression> определяет три предиката исключительно для использования с типом boolean IS TRUE, IS FALSE, IS UNKNOWN.

Они отличаются от их аналогов равенства тем, что они оценивают только True или False. Никогда не Unknown. т.е. UNKNOWN = TRUE будет оцениваться до Unknown, но UNKNOWN IS TRUE оценивается как False.

Ниже приведены полные таблицы истинности для IS и =.

+---------+-------+-------+---------+
|   IS    | TRUE  | FALSE | UNKNOWN |
+---------+-------+-------+---------+
| TRUE    | TRUE  | FALSE | FALSE   |
| FALSE   | FALSE | TRUE  | FALSE   |
| UNKNOWN | FALSE | FALSE | TRUE    |
+---------+-------+-------+---------+

В отличие от

+---------+---------+---------+---------+
|    =    |  TRUE   |  FALSE  | UNKNOWN |
+---------+---------+---------+---------+
| TRUE    | TRUE    | FALSE   | UNKNOWN |
| FALSE   | FALSE   | TRUE    | UNKNOWN |
| UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN |
+---------+---------+---------+---------+

Ответ 2

Как сказано выше, null = null неверен. Он вернет NULL (false)

Для нулевого сравнения вы должны использовать IS NULL или IS NOT NULL.