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