Was ist dieser Operator <=> in MySQL?


163

Ich arbeite an Code, der von einem früheren Entwickler geschrieben wurde, und in einer Abfrage heißt es:

WHERE p.name <=> NULL

Was <=>bedeutet diese Abfrage? Ist es etwas gleich =? Oder ist es ein Syntaxfehler?

Es werden jedoch keine Fehler oder Ausnahmen angezeigt. Ich weiß das schon <>= !=in MySQL .


19
der spaceshipBetreiber
Moha das allmächtige Kamel

4
@ Mhd.Tahawi, Wir brauchen ein Google, mit dem wir direkt nach Betreibern googeln können.
Pacerier

@ Pacerier - ich fand dies vor etwa fünf Jahren symbolhound.com (keine Ahnung, ob es eine bessere Alternative gibt)
Andrew

Antworten:


239

TL; DR

Es ist der NULLsichere Gleichheitsoperator .

Wie beim regulären =Operator werden zwei Werte verglichen und das Ergebnis ist entweder 0(nicht gleich) oder 1(gleich). mit anderen Worten: 'a' <=> 'b'Erträge 0und 'a' <=> 'a'Erträge 1.

Im Gegensatz zum regulären =Operator haben Werte von NULLkeine besondere Bedeutung und ergeben daher niemals NULLein mögliches Ergebnis. also: 'a' <=> NULLErträge 0und NULL <=> NULLErträge 1.

Nützlichkeit

Dies kann nützlich sein, wenn beide Operanden enthalten können NULLund Sie ein konsistentes Vergleichsergebnis zwischen zwei Spalten benötigen.

Ein weiterer Anwendungsfall sind vorbereitete Anweisungen, zum Beispiel:

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

Hier kann der Platzhalter entweder ein skalarer Wert sein oder NULLohne dass Änderungen an der Abfrage vorgenommen werden müssen.

Verwandte Betreiber

Daneben <=>gibt es noch zwei andere Operatoren, mit denen verglichen werden kann NULL, nämlich IS NULLund IS NOT NULL; Sie sind Teil des ANSI-Standards und werden daher im Gegensatz zu <=>MySQL-spezifischen Datenbanken in anderen Datenbanken unterstützt .

Sie können sich diese als Spezialisierungen von MySQL vorstellen <=>:

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

Auf dieser Grundlage kann Ihre spezielle Abfrage (Fragment) in die portablere konvertiert werden:

WHERE p.name IS NULL

Unterstützung

Der SQL: 2003-Standard hat hierfür ein Prädikat eingeführt, das genau wie der MySQL- <=>Operator in folgender Form funktioniert :

IS [NOT] DISTINCT FROM 

Folgendes wird allgemein unterstützt, ist jedoch relativ komplex:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
es bedeutet also, dass es keinen Unterschied gibt? und das <=>ist etwas ein nutzloser Operator? richtig?
Zzlalani

16
@zzlalani Überhaupt nicht; <=>nimmt zwei Operanden, während IS (NOT) NULLnur einer nimmt; großer Unterschied ... es ist =in dieser Hinsicht genauso nützlich wie es selbst.
Ja͢ck

12
@zzlalani IS NULLund IS NOT NULLsind im SQL-Standard. <=>ist eine MySQL-spezifische Erweiterung.
Daniel Dinnyes

5
Also, wie der is not distinct fromOperator. Neugierig zu wissen, ob MySQL einen Index dafür verwenden kann ...
Denis de Bernardy

3
@ Pacerier Nein, das Gegenteil von a <=> bist NOT(a <=> b).
Ja͢ck

57

ist <=> NULL-safe equal to operator

Dieser Operator führt einen Gleichheitsvergleich wie der Operator = durch, gibt jedoch 1 anstelle von NULL zurück, wenn beide Operanden NULL sind, und 0 anstelle von NULL, wenn ein Operand NULL ist.

Hier finden Sie die Dokumentation

Stichprobe :

Sie sollten IS NOT NULL verwenden. (Die Vergleichsoperatoren = und <> geben beide UNBEKANNT mit NULL auf beiden Seiten des Ausdrucks an.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

kann auch den Null-Safe-Equality-Operator negieren, dies ist jedoch kein Standard-SQL.

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

1
Korrektur: <=>sollte als Gleichheitsoperator bezeichnet werden und =ist der NULLunsichere Gleichheitsoperator.
Pacerier

26

Es ist der NULL-Safe gleich Operator

<=> Der Operator wird verwendet, um NULL-Werte mit den Feldern zu vergleichen. Wenn normal = (gleich) Operatoren geben NULL zurück, wenn einer der Vergleichswerte NULL ist. Mit <=> gibt der Operator true oder false zurück. <=> Operator ist derselbe wie IS NULL.

Aus dem Handbuch: -

<=> führt einen Gleichheitsvergleich wie den Operator = durch, gibt jedoch 1 anstelle von NULL zurück, wenn beide Operanden NULL sind, und 0 anstelle von NULL, wenn ein Operand NULL ist.

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

Edit: - ( Obwohl sehr spät eine wichtige Seite Notiz hinzufügen zu erwähnen NICHT <=> auch )

Als Randnotiz:-

NICHT <=>

Es gibt noch einen Punkt NOT <=> , mit dem NULL-Werte mit den Feldern verglichen werden. Wenn normal! = Oder <> (nicht gleich) Operatoren geben NULL zurück, wenn einer der Vergleichswerte NULL ist. Wenn NOT auf <=> angewendet wird, gibt der Operator true oder false zurück. NOT auf <=> Operator angewendet ist identisch mit IS NOT NULL.

Beispiel:-

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

1
NOT <=>ist kein Operator, sondern NOTwird auf das Ergebnis von angewendet op1 <=> op2.
Ja͢ck

@ Jack: - Ja du bist richtig. Die Antwort wurde aktualisiert! Fügte das hinzu, um einen Punkt zu machen :)
Rahul Tripathi

Also ich denke, es gibt keinen <!=>Operator
Kip

@kip: nein gibt es nicht!
Rahul Tripathi

18

<=> ist der null-sichere "gleich" -Operator von MySQL. Aus dem Handbuch :

NULL-sicher gleich. Dieser Operator führt einen Gleichheitsvergleich wie der Operator = durch, gibt jedoch 1 anstelle von NULL zurück, wenn beide Operanden NULL sind, und 0 anstelle von NULL, wenn ein Operand NULL ist.

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

11

NULL-sicher gleich. Dieser Operator führt einen Gleichheitsvergleich wie der Operator = durch, gibt jedoch 1 anstelle von NULL zurück, wenn beide Operanden NULL sind, und 0 anstelle von NULL, wenn ein Operand NULL ist.

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

Es Bedeutung:

Wenn Sie einen NULL-Wert mit einem Nicht-NULL-Wert vergleichen, erhalten Sie NULL. Wenn Sie überprüfen möchten, ob ein Wert null ist.

Der Gleichheitsoperator (<=>), der NULL als normalen Wert betrachtet, gibt also 1 (nicht NULL) zurück, wenn beide Werte NULL sind, und 0 (nicht NULL), wenn einer der Werte NULL ist:

z.B

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

10

<=>ist der NULL-sichere Gleichheitsoperator . a <=> bist dasselbe wie schreiben:

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

Und sorry, ich konnte keinen guten Grund finden, diesen Operator anstelle von zu verwenden AND/OR IS (NOT) NULL. Ihr Beispiel ist zum Beispiel WHERE p.name <=> NULLdasselbe wie WHERE p.name IS NULL.


9

Aus der MySQL-Dokumentation :

NULL-sicher gleich. Dieser Operator führt einen Gleichheitsvergleich wie der Operator = durch, gibt jedoch 1 anstelle von NULL zurück, wenn beide Operanden NULL sind, und 0 anstelle von NULL, wenn ein Operand NULL ist.

Ein Beispiel für die Verwendung des <=>Operators wäre:

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

Welches würde zurückkehren:

1, 1, 0

Ein Beispiel für den regulären =Operator wäre:

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

Welches würde zurückkehren:

1, NULL, NULL

Der <=>Operator ist dem =Operator sehr ähnlich , <=>wird jedoch niemals zurückkehrenNULL



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 |
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.