TL;DR
Det är NULL
säkert lika
operatör.
Som den vanliga =
operatorn jämförs två värden och resultatet är antingen 0
(inte lika) eller 1
(likvärdig); med andra ord:'a' <=> 'b'
ger 0
och 'a' <=> 'a'
ger 1
.
Till skillnad från den vanliga =
operator, värden på NULL
har ingen speciell betydelse och därför ger den aldrig NULL
som ett möjligt resultat; så:'a' <=> NULL
ger 0
och NULL <=> NULL
ger 1
.
Användbarhet
Detta kan vara användbart när båda operanderna kan innehålla NULL
och du behöver ett konsekvent jämförelseresultat mellan två kolumner.
Ett annat användningsfall är med förberedda uttalanden, till exempel:
... WHERE col_a <=> ? ...
Här kan platshållaren vara antingen ett skalärt värde eller NULL
utan att behöva ändra något i frågan.
Relaterade operatörer
Förutom <=>
det finns också två andra operatorer som kan användas för att jämföra med NULL
, nämligen IS NULL
och IS NOT NULL
; de är en del av ANSI-standarden och stöds därför i andra databaser, till skillnad från <=>
, som är MySQL-specifik.
Du kan se dem som specialiseringar av MySQL:s <=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Baserat på detta kan din specifika fråga (fragment) konverteras till den mer portabla:
WHERE p.name IS NULL
Support
SQL:2003-standarden introducerade ett predikat för detta, som fungerar precis som MySQL:s <=>
operatör, i följande form:
IS [NOT] DISTINCT FROM
Följande stöds universellt, men är relativt komplext:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1