Я работаю над кодом, написанным предыдущим разработчиком, и в запросе говорится:
WHERE p.name <=> NULL
Что <=>
означает в этом запросе? Это что-то равное =
? Или это синтаксическая ошибка?
Но это не показывает никаких ошибок или исключений. Я уже знаю, что <>
= !=
в MySQL .
mysql
sql
operators
spaceship-operator
zzlalani
источник
источник
spaceship
операторОтветы:
TL; DR
Это
NULL
безопасный оператор равных .Как и обычный
=
оператор, сравниваются два значения, и результат либо0
(не равен), либо1
(равен); другими словами:'a' <=> 'b'
урожайность0
и'a' <=> 'a'
урожайность1
.В отличие от обычного
=
оператора, значенияNULL
не имеют особого значения и поэтому никогда не приводятNULL
к возможному результату; итак:'a' <=> NULL
урожайность0
иNULL <=> NULL
урожайность1
.Полезность
Это может пригодиться, когда оба операнда могут содержать
NULL
и вам нужен согласованный результат сравнения между двумя столбцами.Другой вариант использования с подготовленными утверждениями, например:
Здесь заполнитель может быть скалярным значением или
NULL
без необходимости что-либо менять в запросе.Связанные операторы
Кроме того,
<=>
есть также два других оператора, которые можно использовать для сравненияNULL
, а именноIS NULL
иIS NOT NULL
; они являются частью стандарта ANSI и поэтому поддерживаются в других базах данных, в отличие от<=>
MySQL.Вы можете думать о них как о специализациях MySQL
<=>
:Исходя из этого, ваш конкретный запрос (фрагмент) может быть преобразован в более переносимый:
Служба поддержки
Стандарт SQL: 2003 ввел предикат для этого, который работает точно так же, как
<=>
оператор MySQL , в следующей форме:Следующее поддерживается повсеместно, но является относительно сложным:
источник
<=>
какой-то бесполезный оператор? право?<=>
берет два операнда, тогда какIS (NOT) NULL
только один; большая разница ... это так же полезно, как=
и в этом отношении.IS NULL
иIS NOT NULL
в стандарте SQL.<=>
является специфическим расширением MySQL.is not distinct from
оператор. Любопытно узнать, может ли MySQL использовать индекс для этого ...a <=> b
естьNOT(a <=> b)
.является <=>
NULL-safe equal to operator
Этот оператор выполняет сравнение на равенство, как оператор =, но возвращает 1, а не NULL, если оба операнда имеют значение NULL, и 0, а не NULL, если один из операндов равен NULL.
Смотрите здесь для документации
Образец :
Вы должны использовать IS NOT NULL. (Операторы сравнения = и <> оба дают UNKNOWN с NULL с обеих сторон выражения.)
также может отрицать нулевой безопасный оператор равенства, но это не стандартный SQL.
источник
<=>
должен называться оператором равенства и=
являетсяNULL
небезопасным оператором равенства.Это NULL-сейф, равный оператору
<=> Оператор используется для сравнения значений NULL с полями. Если normal = (равно), операторы возвращают NULL, если одно из значений сравнения равно NULL. С помощью оператора <=> возвращает значение true или false. <=> Оператор такой же, как IS NULL.
Из руководства: -
Изменить: - ( Хотя очень поздно, чтобы добавить одну важную заметку с упоминанием НЕ <=> также )
На примечании стороны: -
НЕ <=>
Есть еще одна точка NOT <=>, которая используется для сравнения значений NULL с полями. Если нормально! = Или <> (не равно) Операторы возвращают NULL, если одно из значений сравнения равно NULL. Если оператор НЕ применяется к <=>, оператор возвращает значение true или false. НЕ применяется к <=> оператору так же, как IS NOT NULL.
Пример:-
источник
NOT <=>
не оператор, онNOT
применяется к результатуop1 <=> op2
.<!=>
оператора<=>
является нулевым безопасным оператором MySQL "равно". Из руководства :источник
NULL-безопасный равный. Этот оператор выполняет сравнение на равенство, как оператор =, но возвращает 1, а не NULL, если оба операнда имеют значение NULL, и 0, а не NULL, если один из операндов равен NULL.
Это значение:
Когда вы сравниваете значение NULL со значением, отличным от NULL, вы получите NULL. Если вы хотите проверить, является ли значение пустым.
Оператор равенства (<=>), который рассматривает NULL как нормальное значение, поэтому возвращает 1 (не NULL), если оба значения равны NULL, и 0 (не NULL), если одно из значений равно NULL:
например
источник
<=>
является равным NULL оператор-сейф .a <=> b
так же, как писать:И извините, я не смог найти ни одной веской причины использовать этот оператор вместо
AND/OR IS (NOT) NULL
. Ваш пример, например,WHERE p.name <=> NULL
такой же, какWHERE p.name IS NULL
.источник
Из документации MySQL :
Пример использования
<=>
оператора:Который вернется:
Примером обычного
=
оператора будет:Который вернется:
<=>
Оператор очень похож на=
оператор, за исключением того,<=>
никогда не вернусьNULL
источник
Это NULL - Безопасный Равный оператору. Проверьте описание .
источник
источник