Стандартный логический оператор SQL оператор IS vs. equals (=) - PullRequest
19 голосов
/ 22 марта 2012

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

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

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

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

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

По-другому ли работает стандарт SQL: 2011?

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

[2]: SQL: черновик 2011 года PDF страница 335

[3]: SQL: 2003 черновик PDF-страница 397

Ответы [ 2 ]

16 голосов
/ 22 марта 2012

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

Если я правильно прочитал, грамматика <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 |
+---------+---------+---------+---------+
1 голос
/ 22 марта 2012

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

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

...