TL;DR
Това е NULL
безопасно равно
оператор.
Като обикновения =
оператор, две стойности се сравняват и резултатът е или 0
(не е равно) или 1
(равно); с други думи:'a' <=> 'b'
дава 0
и 'a' <=> 'a'
дава 1
.
За разлика от обикновения =
оператор, стойности на NULL
нямат специално значение и така никога не дава NULL
като възможен резултат; така че:'a' <=> NULL
дава 0
и NULL <=> NULL
дава 1
.
Полезност
Това може да бъде полезно, когато и двата операнда могат да съдържат NULL
и имате нужда от последователен резултат за сравнение между две колони.
Друг случай на употреба е с подготвени изрази, например:
... WHERE col_a <=> ? ...
Тук заместителят може да бъде скаларна стойност или NULL
без да се налага да променяте нищо относно заявката.
Свързани оператори
Освен <=>
има и два други оператора, които могат да се използват за сравнение с NULL
, а именно IS NULL
и IS NOT NULL
; те са част от стандарта ANSI и следователно се поддържат в други бази данни, за разлика от <=>
, което е специфично за MySQL.
Можете да ги мислите като специализации на <=>
на MySQL :
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Въз основа на това вашата конкретна заявка (фрагмент) може да бъде преобразувана в по-преносима:
WHERE p.name IS NULL
Поддръжка
Стандартът SQL:2003 въведе предикат за това, който работи точно като <=>
на MySQL оператор в следната форма:
IS [NOT] DISTINCT FROM
Следното е универсално поддържано, но е относително сложно:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1