TL;DR
Es el NULL
seguro igual
operador.
Como el =
regular operador, se comparan dos valores y el resultado es 0
(distinto) o 1
(igual); en otras palabras:'a' <=> 'b'
produce 0
y 'a' <=> 'a'
produce 1
.
A diferencia del =
regular operador, valores de NULL
no tiene un significado especial, por lo que nunca produce NULL
como un posible resultado; entonces:'a' <=> NULL
produce 0
y NULL <=> NULL
produce 1
.
Utilidad
Esto puede resultar útil cuando ambos operandos pueden contener NULL
y necesita un resultado de comparación consistente entre dos columnas.
Otro caso de uso es con declaraciones preparadas, por ejemplo:
... WHERE col_a <=> ? ...
Aquí, el marcador de posición puede ser un valor escalar o NULL
sin tener que cambiar nada sobre la consulta.
Operadores relacionados
Además de <=>
también hay otros dos operadores que se pueden usar para comparar con NULL
, a saber, IS NULL
y IS NOT NULL
; son parte del estándar ANSI y, por lo tanto, son compatibles con otras bases de datos, a diferencia de <=>
, que es específico de MySQL.
Puede pensar en ellos como especializaciones de <=>
de MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
En base a esto, su consulta particular (fragmento) se puede convertir a la más portátil:
WHERE p.name IS NULL
Soporte
El estándar SQL:2003 introdujo un predicado para esto, que funciona exactamente como <=>
de MySQL operador, de la siguiente forma:
IS [NOT] DISTINCT FROM
Lo siguiente es compatible universalmente, pero es relativamente complejo:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1