TL;DR
È il NULL sicuro uguale
operatore.
Come il normale = operatore, vengono confrontati due valori e il risultato è 0 (non uguale) o 1 (pari); in altre parole:'a' <=> 'b' restituisce 0 e 'a' <=> 'a' restituisce 1 .
A differenza del normale = operatore, valori di NULL non hanno un significato speciale e quindi non restituisce mai NULL come possibile risultato; quindi:'a' <=> NULL restituisce 0 e NULL <=> NULL restituisce 1 .
Utilità
Questo può tornare utile quando entrambi gli operandi possono contenere NULL e hai bisogno di un risultato di confronto coerente tra due colonne.
Un altro caso d'uso è con le istruzioni preparate, ad esempio:
... WHERE col_a <=> ? ...
Qui, il segnaposto può essere un valore scalare o NULL senza dover modificare nulla della query.
Operatori correlati
Oltre a <=> ci sono anche altri due operatori che possono essere usati per confrontare NULL , ovvero IS NULL e IS NOT NULL; fanno parte dello standard ANSI e quindi sono supportati su altri database, a differenza di <=> , che è specifico per MySQL.
Puoi pensarli come specializzazioni di <=> di MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Sulla base di ciò, la tua particolare query (frammento) può essere convertita nella più portabile:
WHERE p.name IS NULL
Supporto
Lo standard SQL:2003 ha introdotto un predicato per questo, che funziona esattamente come <=> di MySQL operatore, nella forma seguente:
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