Существует ли метод сравнения значений «DifferentThan» в SQL - PullRequest
1 голос
/ 18 августа 2011

Я был уверен, что в SQL было что-то вроде «DifferentThan».
Я не ищу оператора <>, который не сможет выполнить NULL сравнения.

Например, представьте себеобнуляемый битовый столбец.

При проверке на "не соответствует действительности" я мог бы сделать что-то вроде этого

WHERE COALESCE(myBit,0) = 0

и, возможно, это лучший способ ... Меня не очень интересуеттот.Я особенно пытаюсь запомнить синтаксис для чего-то вроде "DIFFERENTTHAN"

WHERE myBit DIFFERENTTHAN 1

РЕДАКТИРОВАТЬ: я ответил на свой собственный вопрос ниже.

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Синтаксис:

IS [NOT] DISTINCT FROM

Что соответствует стандарту ANSI, но не включено в MSSQLServer

http://www.sqlmag.com/article/sql-server/is-not-distinct-from

1 голос
/ 18 августа 2011

Для стандарт ANSI / ISO SQL, поведение null довольно строго определено. В двух словах:

  • Все выражения, включающие значения NULL, оцениваются как NULL, за исключением coalesce().

  • Все тесты, включающие NULL значения, не пройдены, за исключением явных тестов на недействительность . Следующая ошибка:

    • X = null
    • null = null
    • X < null
    • и т.д.

    По сути, NULL - это значение, которое находится за пределами области переменной. Это означает, что операторы обратного сравнения не являются симметричными WRT для NULL.

Все приведенные ниже выражения, если задействовано значение NULL, сбой и значения NULL проваливаются.

* `X < null`
* `X >= null`
* `X > null`
* `not ( X > null )`
* etc.

In standard SQL, test for `null`/`not null`, one **must** use `IS [NOT] NULL`.

В вашем случае, чтобы тест прошел успешно, если значение равно нулю, вы можете сделать что-то вроде:

  • where ( A = B or B is null ). Это потерпит неудачу, если A равно нулю и B не равно нулю, или A и B не равно нулю и сравнивают неравно. Успешно, если A и B не равны NULL и сравниваются равными, или если B является NULL.
  • where A = coalesce(B,A). Это ведет себя так же, как вышеприведенное выражение. Я предпочитаю, так как синтаксис более лаконичен.

Обратите внимание, что некоторые реализации SQL допускают нулевое поведение, которое отличается от стандартного (например, MS / Sybase Transact-SQL, имеет возможность разрешить тестирование на нулевое значение с помощью стандартных операторов сравнения и разрешить null char / varchar вести себя так, как если бы они были ноль (пустыми) строками. В более ранних версиях SQL Server недействительность была реализована путем создания переменной длины столбца независимо от ее типа. Нулевое значение хранилось с нулевой длиной. Для char / varchar поля, ноль (пустая) строка была сохранена как один пробел. Не совсем интуитивно. Как побочный эффект, объявление как foo char(8) null было эквивалентно объявлению foo varchar(8) null.

Даже если ваша реализация SQL поддерживает нестандартное нулевое поведение, вы должны избегать его и кодировать, как если бы это был стандартный SQL с поведением нулей ANSI. В большинстве реализаций, которые поддерживают нестандартное нулевое поведение, это поведение настраивается с помощью параметра времени выполнения. Ваше стандартное кодирование даст одинаковые результаты, независимо от того, работаете ли вы при стандартном поведении NULL в нуле или нет.

0 голосов
/ 18 августа 2011

Вы можете попробовать это

WHERE NOT myBit = 1

, который не является единственным оператором, но немного чище, чем использование COALESCE.

...