TL; DR
Это NULL
безопасный оператор равных .
Как и обычный =
оператор, сравниваются два значения, и результат либо 0
(не равен), либо 1
(равен); другими словами: 'a' <=> 'b'
урожайность 0
и 'a' <=> 'a'
урожайность 1
.
В отличие от обычного =
оператора, значения NULL
не имеют особого значения и поэтому никогда не приводят NULL
к возможному результату; итак: 'a' <=> NULL
урожайность 0
и NULL <=> NULL
урожайность 1
.
Полезность
Это может пригодиться, когда оба операнда могут содержать NULL
и вам нужен согласованный результат сравнения между двумя столбцами.
Другой вариант использования с подготовленными утверждениями, например:
... WHERE col_a <=> ? ...
Здесь заполнитель может быть скалярным значением или NULL
без необходимости что-либо менять в запросе.
Связанные операторы
Кроме того, <=>
есть также два других оператора, которые можно использовать для сравнения NULL
, а именно IS NULL
и IS NOT NULL
; они являются частью стандарта ANSI и поэтому поддерживаются в других базах данных, в отличие от <=>
MySQL.
Вы можете думать о них как о специализациях MySQL <=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Исходя из этого, ваш конкретный запрос (фрагмент) может быть преобразован в более переносимый:
WHERE p.name IS NULL
Служба поддержки
Стандарт SQL: 2003 ввел предикат для этого, который работает точно так же, как <=>
оператор MySQL , в следующей форме:
IS [NOT] DISTINCT FROM
Следующее поддерживается повсеместно, но является относительно сложным:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1
spaceship
оператор