2012-03-22 4 views
14

На странице Wikipedia для SQL есть несколько таблиц истинности о логической логике в SQL. [1] На странице Википедии есть источник SQL: 2003.Стандартный SQL-логический оператор IS против оператора equals (=)

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

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

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

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

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

[1]: Wikipedia on SQL

[2]: SQL:2011 draft PDF страница 335

[3]: SQL:2003 draft PDF страница 397

+4

Ничего равно NULL, даже не NULL. Таким образом, 'NULL = NULL',' NULL = 1' и '1 = NULL' являются ложными (ну, действительно, все они' NULL'/'Unknown ', который не является true *, и поэтому действительно близок к тому, чтобы быть ложным). Но 'NULL IS NULL' - это правда. – MatBailie

+0

Я еще не читал ваших ссылок. 'SQLite' имеет оператор' IS', который является взаимозаменяемым с '=', за исключением того, что он имеет семантику, которая 'NULL = NULL'. –

+0

На что мы должны смотреть на странице 335? Уверены, у вас есть номер правой страницы? Речь идет о '' –

ответ

10

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

Если я прочитал, что правильно <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 | 
+---------+---------+---------+---------+ 
+0

Обратите внимание, что операторы: «IS TRUE», «FALSE», «NULL» и «UNKNOWN». Они являются унарными операторами, оценивая выражение LHS в отношении состояния RHS. Таблица IS должна считываться как «оператор сверху, операнд вниз»; UNKNOWN UNKNOWN оценивает значение TRUE. Также будьте осторожны, что LHS может быть «строковым типом» (вероятно, не правильным техническим термином), а затем оценка проходит через каждый из элементов в LHS. Кроме того, операторы могут быть сведены на нет 'IS NOT NULL', 'IS NOT TRUE', 'NOT FALSE', 'NOT UNKNOWN'. Это может привести к серьезным головным болям. (Продолжение) –

+0

(Продолжение): IIRC, с строкой, «строка IS NOT NULL» и «NOT (row IS NULL)» - это не тот же ответ, обязательно. Я думаю, что разница в том, что «NOT (row IS NULL)» оценивается как true, если какой-то столбец не является нулевым, но «row IS NOT NULL» оценивается как true, только если все столбцы не равны нулю. Для одного значения в «строке» это одно и то же; для нескольких значений они не обязательно одинаковы. –

+0

@JonathanLeffler Стандарты (2003 и 2011) используют термин «логический оператор IS». Если бы они были независимыми унарными операторами, не могли бы они использовать множественное число? См. Раздел 6.34 '' <выражение логического значения> '' на печатной странице № 281. –

0

Как сказал выше плакат, null = null не является правильным. Он вернет NULL (false)

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

+0

*** Он вернет NULL (false) *** не является допустимым утверждением. 'NULL! == FALSE',' NULL! == TRUE', 'NULL! == NULL'. Это просто * undefined *. – Fr0zenFyr

Смежные вопросы