TL;DR
Het is de NULL
veilig gelijk
telefoniste.
Zoals de gewone =
operator, worden twee waarden vergeleken en het resultaat is ofwel 0
(niet gelijk aan) of 1
(Gelijk); met andere woorden:'a' <=> 'b'
levert 0
op en 'a' <=> 'a'
levert 1
op .
In tegenstelling tot de gewone =
operator, waarden van NULL
hebben geen speciale betekenis en geven dus nooit NULL
als mogelijke uitkomst; dus:'a' <=> NULL
levert 0
op en NULL <=> NULL
levert 1
op .
Nut
Dit kan handig zijn wanneer beide operanden NULL
. kunnen bevatten en je hebt een consistent vergelijkingsresultaat tussen twee kolommen nodig.
Een andere use-case is met voorbereide verklaringen, bijvoorbeeld:
... WHERE col_a <=> ? ...
Hier kan de tijdelijke aanduiding een scalaire waarde zijn of NULL
zonder iets aan de zoekopdracht te hoeven veranderen.
Verwante operators
Naast <=>
er zijn ook twee andere operatoren die kunnen worden gebruikt om te vergelijken met NULL
, namelijk IS NULL
en IS NOT NULL
; ze maken deel uit van de ANSI-standaard en worden daarom ondersteund door andere databases, in tegenstelling tot <=>
, wat MySQL-specifiek is.
Je kunt ze zien als specialisaties van MySQL's <=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Op basis hiervan kan uw specifieke zoekopdracht (fragment) worden geconverteerd naar de meer draagbare:
WHERE p.name IS NULL
Ondersteuning
De SQL:2003-standaard introduceerde hiervoor een predikaat, dat precies werkt als MySQL's <=>
operator, in de volgende vorm:
IS [NOT] DISTINCT FROM
Het volgende wordt universeel ondersteund, maar is relatief complex:
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1