Mysql
 sql >> Database >  >> RDS >> Mysql

Cos'è questo operatore <=> in MySQL?

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