TL;DR
É o
NULL
seguro igual
operador. Como o
=
normal operador, dois valores são comparados e o resultado é 0
(diferente) ou 1
(igual); em outras palavras:'a' <=> 'b'
produz 0
e 'a' <=> 'a'
rende 1
. Ao contrário do
=
normal operador, valores de NULL
não tem um significado especial e, portanto, nunca produz NULL
como resultado possível; então:'a' <=> NULL
produz 0
e NULL <=> NULL
rende 1
. Utilidade
Isso pode ser útil quando ambos os operandos podem conter
NULL
e você precisa de um resultado de comparação consistente entre duas colunas. Outro caso de uso é com instruções preparadas, por exemplo:
... WHERE col_a <=> ? ...
Aqui, o espaço reservado pode ser um valor escalar ou
NULL
sem ter que mudar nada na consulta. Operadores relacionados
Além de
<=>
há também dois outros operadores que podem ser usados para comparar com NULL
, ou seja, IS NULL
e IS NOT NULL
; eles fazem parte do padrão ANSI e, portanto, são compatíveis com outros bancos de dados, ao contrário de <=>
, que é específico do MySQL. Você pode pensar neles como especializações do
<=>
do MySQL :'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Com base nisso, sua consulta específica (fragmento) pode ser convertida para a mais portátil:
WHERE p.name IS NULL
Suporte
O padrão SQL:2003 introduziu um predicado para isso, que funciona exatamente como o
<=>
do MySQL operador, da seguinte forma:IS [NOT] DISTINCT FROM
O seguinte é universalmente suportado, mas é relativamente complexo:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1