TL; DR
È l' operatore NULL
sicuro uguale .
Come l' =
operatore normale , vengono confrontati due valori e il risultato è 0
(non uguale) o 1
(uguale); in altre parole: 'a' <=> 'b'
rese 0
e 'a' <=> 'a'
rese1
.
A differenza =
dell'operatore normale , i valori di NULL
non hanno un significato speciale e quindi non producono mai NULL
come risultato possibile; quindi: 'a' <=> NULL
rese 0
e NULL <=> NULL
rese 1
.
Utilità
Ciò può rivelarsi utile quando entrambi gli operandi possono contenere NULL
ed è 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 NULL
senza 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 NULL
e 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
spaceship
operatore