Co to za operator <=> w MySQL?

163

Pracuję nad kodem napisanym przez poprzedniego programistę i w zapytaniu jest napisane:

WHERE p.name <=> NULL

Co <=>oznacza w tym zapytaniu? Czy to jest coś równego =? Czy jest to błąd składni?

Ale nie pokazuje żadnych błędów ani wyjątków. Już to wiem <>= !=w MySQL .

zzlalani
źródło
19
spaceshipoperatora
Moha wszechmogący wielbłąda
4
@ Mhd.Tahawi, Potrzebujemy Google, które pozwoli nam bezpośrednio wyszukiwać operatorów w Google.
Pacerier,
@Pacerier - znalazłem to jakieś 5 lat temu symbolhound.com (nie wiem, czy jest lepsza alternatywa)
Andrew

Odpowiedzi:

239

TL; DR

To NULLbezpieczny operator równości .

Podobnie jak =operator zwykły , porównywane są dwie wartości, a wynik jest albo 0(nierówny) albo 1(równy); innymi słowy: 'a' <=> 'b'plony 0i 'a' <=> 'a'plony 1.

W przeciwieństwie do zwykłego =operatora, wartości NULLnie mają specjalnego znaczenia, więc nigdy nie dają wyniku NULLjako możliwy wynik; a więc: 'a' <=> NULLplony 0i NULL <=> NULLplony 1.

Przydatność

Może to być przydatne, gdy oba operandy mogą zawierać NULLi potrzebujesz spójnego wyniku porównania między dwiema kolumnami.

Inny przypadek użycia dotyczy przygotowanych instrukcji, na przykład:

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

Tutaj symbol zastępczy może być wartością skalarną lub NULLbez konieczności zmiany czegokolwiek w zapytaniu.

Powiązane operatory

Poza tym <=>istnieją również dwa inne operatory, których można użyć do porównania NULL, a mianowicie IS NULLi IS NOT NULL; są częścią standardu ANSI i dlatego są obsługiwane w innych bazach danych, w przeciwieństwie do tego <=>, który jest specyficzny dla MySQL.

Możesz myśleć o nich jako o specjalizacjach MySQL <=>:

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

Na tej podstawie twoje konkretne zapytanie (fragment) można przekonwertować na bardziej przenośne:

WHERE p.name IS NULL

Wsparcie

W standardzie SQL: 2003 wprowadzono predykat do tego, który działa dokładnie tak, jak <=>operator MySQL , w następującej postaci:

IS [NOT] DISTINCT FROM 

Poniższe są powszechnie obsługiwane, ale są stosunkowo złożone:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1
Jacek
źródło
2
więc to znaczy, że nie ma różnicy? a to <=>jest trochę bezużyteczny operator? dobrze?
zzlalani,
16
@zzlalani Wcale nie; <=>przyjmuje dwa operandy, a IS (NOT) NULLtylko jeden; duża różnica ... pod tym względem jest tak =samo przydatna jak ona sama.
Ja͢ck,
12
@zzlalani IS NULLi IS NOT NULLsą w standardzie SQL. <=>to rozszerzenie specyficzne dla MySQL.
Daniel Dinnyes,
5
Tak więc, jak is not distinct fromoperator. Ciekawe, czy MySQL może użyć indeksu w tym ...
Denis de Bernardy
3
@Pacerier Nie, odwrotność a <=> bjest NOT(a <=> b).
Ja͢ck
57

jest <=> NULL-safe equal to operator

Ten operator wykonuje porównanie równości, takie jak operator =, ale zwraca 1 zamiast NULL, jeśli oba operandy mają wartość NULL i 0 zamiast NULL, jeśli jeden operand ma wartość NULL.

Zobacz dokumentację

Próbka:

powinieneś użyć IS NOT NULL. (Operatory porównania = i <> dają UNKNOWN z wartością NULL po obu stronach wyrażenia).

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

może również negować null safe operator równości, ale nie jest to standardowy SQL.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);
Drixson Oseña
źródło
1
Poprawka: <=>należy nazywać operatorem równości i =jest NULLniebezpiecznym operatorem równości.
Pacerier
26

Jest to bezpieczna wartość NULL równa operatorowi

<=> Operator służy do porównywania wartości NULL z polami. Jeśli normal = (równa się) Operatory zwracają NULL, jeśli jedna z wartości porównania jest równa NULL. Z operatorem <=> zwraca prawdę lub fałsz. <=> Operator jest taki sam, jak IS NULL.

Z instrukcji: -

<=> wykonuje porównanie równości, jak operator =, ale zwraca 1 zamiast NULL, jeśli oba operandy mają wartość NULL, i 0 zamiast NULL, jeśli jeden operand ma wartość NULL.

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

Edycja: - ( Chociaż bardzo późno, by dodać jedną ważną marginesie wspomnieć NIE <=> jak dobrze )

Na marginesie:-

NIE <=>

Jest jeszcze jeden punkt NOT <=>, który służy do porównywania wartości NULL z polami. Jeśli normalny! = Lub <> (nie równa się) Operatory zwracają NULL, jeśli jedna z wartości porównania jest równa NULL. Z NIE zastosowanym do operatora <=> zwraca prawdę lub fałsz. NIE zastosowane do operatora <=> oznacza to samo, co NIE JEST NULL.

Przykład:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0
Rahul Tripathi
źródło
1
NOT <=>nie jest operatorem, jest NOTstosowany do wyniku op1 <=> op2.
Ja͢ck
@Jack: - Tak, masz rację. Zaktualizowałem odpowiedź! Dodałem to, żeby zwrócić uwagę :)
Rahul Tripathi
Więc chyba nie ma <!=>operatora
Kip,
@kip: nie, nie ma!
Rahul Tripathi
18

<=>jest operatorem MySQL „równe” bezpiecznym do null. Z instrukcji :

NULL-safe równy. Ten operator wykonuje porównanie równości, takie jak operator =, ale zwraca 1 zamiast NULL, jeśli oba operandy mają wartość NULL i 0 zamiast NULL, jeśli jeden operand ma wartość NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL
eliksenid
źródło
11

NULL-safe równy. Ten operator wykonuje porównanie równości, takie jak operator =, ale zwraca 1 zamiast NULL, jeśli oba operandy mają wartość NULL i 0 zamiast NULL, jeśli jeden operand ma wartość NULL.

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

To znaczenie:

Kiedy porównasz wartość NULL z wartością inną niż NULL, otrzymasz NULL. Jeśli chcesz sprawdzić, czy wartość jest null.

Operator równości (<=>), który traktuje NULL jako wartość normalną, więc zwraca 1 (nie NULL), jeśli obie wartości mają wartość NULL i zwraca 0 (nie NULL), jeśli jedna z wartości ma wartość NULL:

na przykład

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable
Dimag Kharab
źródło
10

<=>jest operatorem równości bezpiecznym dla wartości NULL . a <=> bto to samo co pisanie:

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

Przepraszam, nie mogłem znaleźć jednego dobrego powodu, aby użyć tego operatora zamiast AND/OR IS (NOT) NULL. Twój przykład WHERE p.name <=> NULLjest taki sam jak WHERE p.name IS NULL.

Salman A
źródło
9

Z dokumentacji MySQL :

NULL-safe równy. Ten operator wykonuje porównanie równości, podobnie jak operator =, ale zwraca 1 zamiast NULL, jeśli oba operandy mają wartość NULL, i 0 zamiast NULL, jeśli jeden operand ma wartość NULL.

Przykład użycia <=>operatora to:

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

Który zwróciłby:

1, 1, 0

Przykładem zwykłego =operatora byłoby:

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

Który zwróciłby:

1, NULL, NULL

<=>Operator jest bardzo podobny do =operatora, chyba <=>nigdy nie powróciNULL

Jojodmo
źródło
5

Jest to NULL - bezpieczny równy operatorowi. Sprawdź opis .

MusicLovingIndianGirl
źródło
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 |
zloctb
źródło