Unterschied zwischen NVL und NVL2

NVL und NVL2 sind beides SQL Funktionen, welche häufig in SQL Statements, SQL Prozeduren oder SQL Funktionen benötigt werden. Dieser Beitrag beschreibt den Unterschied zwischen NVL und NVL2. Bei NVL wird lediglich die erste Expression überprüft. Ist diese ungleich NULL wird das Feld ausgegeben. Tritt hier allerdings ein NULL Wert auf, so wird der zweite Ausdruck ausgeführt bzw. ausgegeben.

IF 
expr1 IS NOT NULL
THEN expr1
END IF;

IF
exp1 IS NULL
THEN expr2
END IF;

Bei NVL2 hingegen muss nicht unbedingt die expr1 ausgegeben werden. Hier kann definiert werden, welcher Wert oder welches Feld ausgegeben werden.

IF 
expr1 IS NOT NULL
THEN expr2
END IF;

IF
expr1 IS NULL
THEN expr3
END IF;

NVL2 ist funktionsgleich mit NVL wenn folgendes gilt:

NVL(expr1, expr2) = NVL2(expr1, expr1, expr2)

Notwendig sind die Funktionen teilweise bei Abfragen. Wird zum Beispiel eine IF Abfrage durchgeführt, kann es ohne Definition von NULL Values zu einem Fehler kommen. So zum Beispiel bei aggregierten Berechnungen. Wie lautet das Ergebnis der Summe NULL + NULL bzw. undefiniert + undefiniert?

NVL in Kombination mit MAX und MIN

NVL ist in Kombination mit MAX oder MIN auch für die Rückgabe keiner Zeilen sehr hilfreich. Sollte z.B. der Code ein WHERE 1=2 eingebaut haben, dann werden keine Zeilen zurückgeliefert (auch keine NULL Value). Um eine NULL Value zu erzeugen, kannst du dich mit der MAX oder MIN Funktion aushelfen. Diese liefert somit immer eine Zeile – wenn auch nur mit einem NULL Wert. In Kombination mit einem NVL kannst du schlussendlich auf „liefert Zeilen“ bzw. „liefert keine Zeilen“ prüfen.

SELECT NVL(MAX(1), 2)
FROM DUAL
WHERE 1=2;

Das obere Beispiel würde in diesem Fall den Wert 2 zurückliefern. Durch die Bedingung werden keine Zeilen zurückgeliefert. Das MAX(1) liefert jedoch auch bei keinen Zeilen einen NULL Wert zurück. Durch das NVL wird dieser NULL Wert abgefangen und in die Zahl 2 umgewandelt.