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