TL;DR
C'est le NULL
sûr égal
opérateur.
Comme le =
normal , deux valeurs sont comparées et le résultat est soit 0
(pas égal) ou 1
(égal); autrement dit :'a' <=> 'b'
donne 0
et 'a' <=> 'a'
donne 1
.
Contrairement au =
normal opérateur, valeurs de NULL
n'a pas de signification particulière et ne donne donc jamais NULL
comme résultat possible ; donc :'a' <=> NULL
donne 0
et NULL <=> NULL
donne 1
.
Utilité
Cela peut être utile lorsque les deux opérandes peuvent contenir NULL
et vous avez besoin d'un résultat de comparaison cohérent entre deux colonnes.
Un autre cas d'utilisation concerne les instructions préparées, par exemple :
... WHERE col_a <=> ? ...
Ici, l'espace réservé peut être soit une valeur scalaire, soit NULL
sans rien changer à la requête.
Opérateurs associés
Outre <=>
il y a aussi deux autres opérateurs qui peuvent être utilisés pour comparer avec NULL
, à savoir IS NULL
et IS NOT NULL
; ils font partie de la norme ANSI et sont donc pris en charge sur d'autres bases de données, contrairement à <=>
, qui est spécifique à MySQL.
Vous pouvez les considérer comme des spécialisations du <=>
de MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Sur cette base, votre requête particulière (fragment) peut être convertie en une requête plus portable :
WHERE p.name IS NULL
Assistance
Le standard SQL:2003 a introduit un prédicat pour cela, qui fonctionne exactement comme le <=>
de MySQL opérateur, sous la forme suivante :
IS [NOT] DISTINCT FROM
Ce qui suit est universellement pris en charge, mais est relativement complexe :
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1