Cos'è questo operatore <=> in MySQL?


163

Sto lavorando su un codice scritto da uno sviluppatore precedente e in una query 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 .


19
l' spaceshipoperatore
Moha l'onnipotente cammello,

4
@ Mhd.Tahawi, abbiamo bisogno di un google che ci consenta di google direttamente per gli operatori.
Pacerier,

@Pacerier - L'ho trovato, circa 5 anni fa symbolhound.com (non so se c'è un'alternativa migliore)
Andrew

Risposte:


239

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

2
quindi significa che non c'è differenza? e questo <=>è in qualche modo un operatore inutile? giusto?
zzlalani,

16
@zzlalani Niente affatto; <=>accetta due operandi mentre IS (NOT) NULLne prende solo uno; grande differenza ... è utile quanto lo =stesso in questo senso.
Ja͢ck,

12
@zzlalani IS NULLe IS NOT NULLsono nello standard SQL. <=>è un'estensione specifica di MySQL.
Daniel Dinnyes,

5
Quindi, come l' is not distinct fromoperatore. Curioso di sapere se MySQL può usare un indice su questo ...
Denis de Bernardy,

3
@Pacerier No, l'inverso di a <=> bè NOT(a <=> b).
Ja͢ck,

57

è <=> 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 documentazione

Campione :

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

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

può anche negare l'operatore null uguaglianza sicura ma questo non è SQL standard.

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

1
Correzione: <=>dovrebbe essere chiamato operatore di uguaglianza ed =è l' NULLoperatore di uguaglianza non sicuro.
Pacerier,

26

È il NULL-sicuro uguale all'operatore

<=> L'operatore viene utilizzato per confrontare i valori NULL con i campi. Se normale = (uguale a) 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

Edit: - ( Anche se molto tardi per aggiungere un importante nota a margine di nota NON <=> pure )

In una nota a margine:-

NON <=>

C'è ancora un punto NON <=> che viene utilizzato per confrontare i valori NULL con i campi. Se normale! = O <> (non uguale) Gli operatori restituiscono NULL se uno dei valori di confronto è NULL. Con NOT applicato a <=> l'operatore restituisce vero o falso. NOT 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

1
NOT <=>non è un operatore, viene NOTapplicato al risultato di op1 <=> op2.
Ja͢ck,

@ Jack: - Sì, hai ragione. Aggiornato la risposta! Aggiunto che per sottolineare un punto :)
Rahul Tripathi,

Quindi suppongo che non ci sia nessun <!=>operatore
Kip,

@kip: no non c'è!
Rahul Tripathi,

18

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

NULL-sicuro 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

11

NULL-sicuro 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

Significa:

Quando confronti un valore NULL con un valore non NULL, otterrai NULL. Se si desidera verificare se un valore è null.

L'operatore di uguaglianza (<=>) che considera NULL come un valore normale, quindi restituisce 1 (non NULL) se entrambi i valori sono NULL e restituisce 0 (non NULL) se uno dei valori è NULL:

per esempio

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>è l' operatore uguale NULL-safe . a <=> bè come scrivere:

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 un buon motivo per usare questo operatore invece di AND/OR IS (NOT) NULL. Il tuo esempio, ad esempio, WHERE p.name <=> NULLè lo stesso di WHERE p.name IS NULL.


9

Dalla documentazione di MySQL :

NULL-sicuro 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 sarebbe:

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

Che ritornerebbe:

1, 1, 0

Un esempio di =operatore normale sarebbe:

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

Che ritornerebbe:

1, NULL, NULL

L' <=>operatore è molto simile =all'operatore, tranne <=>che non tornerà mai piùNULL



1
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
+----+------+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  3 | NULL |  3 | NULL |
|  4 | NULL |  3 | NULL |
|  3 | NULL |  4 | NULL |
|  4 | NULL |  4 | NULL |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.