TL;DR
Jest to NULL
bezpieczne równe
operatora.
Jak zwykły =
operatora, porównywane są dwie wartości i wynikiem jest albo 0
(nie równe) lub 1
(równy); innymi słowy:'a' <=> 'b'
daje 0
i 'a' <=> 'a'
daje 1
.
W przeciwieństwie do zwykłego =
operator, wartości NULL
nie mają specjalnego znaczenia, więc nigdy nie zwracają NULL
jako możliwy wynik; więc:'a' <=> NULL
daje 0
i NULL <=> NULL
daje 1
.
Przydatność
Może się to przydać, gdy oba operandy mogą zawierać NULL
i potrzebujesz spójnego wyniku porównania między dwiema kolumnami.
Innym przypadkiem użycia są przygotowane instrukcje, na przykład:
... WHERE col_a <=> ? ...
Tutaj symbol zastępczy może być wartością skalarną lub NULL
bez konieczności zmiany czegokolwiek w zapytaniu.
Powiązani operatorzy
Poza <=>
istnieją również dwa inne operatory, których można użyć do porównania z NULL
, czyli IS NULL
i IS NOT NULL
; są częścią standardu ANSI i dlatego są obsługiwane w innych bazach danych, w przeciwieństwie do <=>
, 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 zapytanie (fragment) może zostać przekonwertowane na bardziej przenośne:
WHERE p.name IS NULL
Wsparcie
Standard SQL:2003 wprowadził dla tego predykat, który działa dokładnie tak, jak <=>
MySQL operatora, w postaci:
IS [NOT] DISTINCT FROM
Następujące informacje 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