query - select mysql case




Cos'è questo operatore<=> in MySQL? (6)

Sto lavorando su codice scritto da uno sviluppatore precedente e in una query che dice,

WHERE p.name <=> NULL

Cosa significa <=> in questa query? È qualcosa di uguale a = ? O è un errore di sintassi?

Ma non mostra errori o eccezioni. So già che <> = != In MySQL .


Somiglianza con = operatore

Come l'operatore regolare = , vengono confrontati due valori e il risultato è 0 (non uguale) o 1 (uguale); in altre parole: 'a' <=> 'b' produce 0 e 'a' <=> 'a' produce 1 .

Differenza con = operatore

A differenza dell'operatore regular = , i valori di NULL non hanno un significato speciale e quindi non restituiscono mai NULL come possibile risultato; quindi: 'a' <=> NULL restituisce 0 e NULL <=> NULL restituisce NULL <=> NULL 1 .

Contrariamente a = , per cui 'a' = NULL restituisce NULL e anche NULL = NULL restituisce NULL ; A proposito, quasi tutti gli operatori e le funzioni di MySQL funzionano in questo modo, perché il confronto con NULL è fondamentalmente indefinito.

Utilità

Questo è molto 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 dichiarazioni preparate, ad esempio:

... WHERE col_a <=> ? ...

Qui, il segnaposto può essere un valore scalare o NULL senza dover modificare nulla sulla query.

Operatori correlati

Oltre a <=> ci sono anche altri due operatori che possono essere usati per confrontare NULL , cioè IS NULL e IS NOT NULL ; fanno parte dello standard ANSI e pertanto sono supportati su altri database, diversamente da <=> , che è specifico per MySQL.

Puoi considerarli come specializzazioni di MySQL <=> :

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

In base a ciò, la tua particolare query (frammento) può essere convertita in un dispositivo più portatile:

WHERE p.name IS NULL

È l' operatore NULL sicuro uguale all'operatore

<=> L'operatore è usato per confrontare i valori NULL con i campi. Se normale = (uguale) Gli operatori restituiscono NULL se uno dei valori di confronto è NULL. Con l'operatore <=> restituisce vero o falso. <=> L'operatore è uguale a IS NULL.

Dal manuale: -

<=> esegue un confronto di uguaglianza come l'operatore =, ma restituisce 1 anziché NULL se entrambi gli operandi sono NULL e 0 anziché NULL se un operando è NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Modifica: - ( Anche se molto tardi per aggiungere una nota importante che menziona NOT <=> pure )

In una nota a margine:-

NON <=>

C'è un altro punto NOT <=> che viene utilizzato per confrontare i valori NULL con i campi. Se normale! = O <> (non uguale a) gli operatori restituiscono NULL se uno dei valori di confronto è NULL. Con NOT applicato all'operatore <=> restituisce vero o falso. NON applicato a <=> L'operatore è uguale a IS NOT NULL.

Esempio:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

è <=> NULL-safe equal to operator

Questo operatore esegue un confronto di uguaglianza come l'operatore =, ma restituisce 1 anziché NULL se entrambi gli operandi sono NULL e 0 anziché NULL se un operando è NULL.

Vedi qui per la documentation

Campione :

dovresti usare IS NOT NULL. (Gli operatori di confronto = e <> entrambi danno UNKNOWN con NULL su entrambi i lati dell'espressione.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

può anche negare l'operatore di uguaglianza nullo ma questo non è SQL standard.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Dalla documentazione di MySQL :

NULL-safe uguale. Questo operatore esegue un confronto di uguaglianza come l'operatore =, ma restituisce 1 anziché NULL se entrambi gli operandi sono NULL e 0 anziché NULL se un operando è NULL.

Un esempio che utilizza l'operatore <=> potrebbe essere:

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

Quale ritornerebbe:

1, 1, 0

Un esempio di operatore regolare = sarebbe:

SELECT 1 = 1, NULL = NULL, 1 = NULL;

Quale ritornerebbe:

1, NULL, NULL

L'operatore <=> è molto simile all'operatore = , tranne <=> non restituirà mai NULL


<=> è l' operatore di uguale sicurezza NULL . a <=> b è uguale alla scrittura:

CASE
    WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
    WHEN a IS NULL OR  b IS NULL THEN 0 -- one operand is null then 0
    ELSE a = b                          -- else behave like normal = operator
END

E scusa, non ho trovato una buona ragione per usare questo operatore invece di AND/OR IS (NOT) NULL . Il tuo esempio, ad esempio, WHERE p.name <=> NULL è uguale a WHERE p.name IS NULL .


<=> è l'operatore "uguale a" nullo di MySQL. Dal manuale :

NULL-safe uguale. Questo operatore esegue un confronto di uguaglianza come l'operatore =, ma restituisce 1 anziché NULL se entrambi gli operandi sono NULL e 0 anziché NULL se un operando è NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL




spaceship-operator