TL; DR
È l' operatore NULLsicuro uguale .
Come l' =operatore normale , vengono confrontati due valori e il risultato è 0(non uguale) o 1(uguale); in altre parole: 'a' <=> 'b'rese 0e 'a' <=> 'a'rese1 .
A differenza =dell'operatore normale , i valori di NULLnon hanno un significato speciale e quindi non producono mai NULLcome risultato possibile; quindi: 'a' <=> NULLrese 0e NULL <=> NULLrese 1.
Utilità
Ciò può rivelarsi utile quando entrambi gli operandi possono contenere NULLed è necessario un risultato di confronto coerente tra due colonne.
Un altro caso d'uso è con dichiarazioni preparate, ad esempio:
... WHERE col_a <=> ? ...
Qui, il segnaposto può essere un valore scalare o NULLsenza dover modificare nulla della query.
Operatori collegati
Inoltre <=>ci sono anche altri due operatori che possono essere usati per confrontare NULL, vale a dire IS NULLe IS NOT NULL; fanno parte dello standard ANSI e quindi supportati su altri database, a differenza di <=>MySQL.
Puoi pensarli come specializzazioni di MySQL <=>:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Sulla base di questo, la tua particolare query (frammento) può essere convertita nel più portatile:
WHERE p.name IS NULL
Supporto
Lo standard SQL: 2003 ha introdotto un predicato per questo, che funziona esattamente come l' <=>operatore MySQL , nella seguente forma:
IS [NOT] DISTINCT FROM
Quanto segue è universalmente supportato, ma è relativamente complesso:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1
spaceshipoperatore