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