TL;DR
Det er NULL
sikker lige
operatør.
Ligesom den almindelige =
operatør, sammenlignes to værdier, og resultatet er enten 0
(ikke lig) eller 1
(lige); med andre ord:'a' <=> 'b'
giver 0
og 'a' <=> 'a'
giver 1
.
I modsætning til den almindelige =
operator, værdier af NULL
har ikke en speciel betydning, og derfor giver det aldrig NULL
som et muligt resultat; så:'a' <=> NULL
giver 0
og NULL <=> NULL
giver 1
.
Anvendelighed
Dette kan være nyttigt, når begge operander kan indeholde NULL
og du har brug for et ensartet sammenligningsresultat mellem to kolonner.
En anden use-case er med forberedte udsagn, for eksempel:
... WHERE col_a <=> ? ...
Her kan pladsholderen enten være en skalær værdi eller NULL
uden at skulle ændre noget ved forespørgslen.
Relaterede operatører
Udover <=>
der er også to andre operatorer, der kan bruges til at sammenligne med NULL
, nemlig IS NULL
og IS NOT NULL
; de er en del af ANSI-standarden og understøttes derfor på andre databaser, i modsætning til <=>
, som er MySQL-specifik.
Du kan tænke på dem som specialiseringer af MySQL's <=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Baseret på dette kan din specifikke forespørgsel (fragment) konverteres til den mere bærbare:
WHERE p.name IS NULL
Support
SQL:2003-standarden introducerede et prædikat for dette, som fungerer nøjagtigt som MySQL's <=>
operatør, i følgende form:
IS [NOT] DISTINCT FROM
Følgende er universelt understøttet, men er relativt komplekst:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1