Unterschiede zwischen NVL, NVL2 und COALESCE

NVL und NVL2 sind Oracle-spezifisch und wurden vor der Erstellung des ANSI-92-Standards (einschließlich COALESCE) eingeführt. NVL und COALESCE sind nahezu identisch, auch wenn es einige Unterschiede gibt, auf die ich hinweisen möchte:

NVL führt immer beide Argumente aus

NVL wertet immer das erste und zweite Argument aus und ist daher etwas langsamer als COALESCE. Zum Beispiel führt SELECT NVL (1, longFunctionCall ()) FROM DUAL das erste und zweite Argument aus, auch wenn klar ist, dass das zweite Argument nicht verwendet wird. Trotz COALESCE wird das erste Argument (das 1 und nicht NULL ist) ausgeführt und dort beendet.

COALESCE führt manchmal das zweite Argument aus

Meistens führt COALESCE nur das erste Argument aus, aber es gibt Ausnahmeereignisse, wenn das erste Argument anders ist als NULL. Ein Fall ist die Sequenz NEXTVAL. Sie können das Phänomen bei Verwendung von CURVAL testen, um festzustellen, dass sich die Reihenfolge geändert hat.

NVL führt eine implizite Konversation des Datentyps durch

Ein großer Vorteil von NVL ist die implizite Konversation des Datentyps, dh der Datentyp des ersten Parameters zählt. Daher funktioniert die folgende Anweisung: SELECT NVL (‚String‘, SYSDATE) FROM DUAL; Dies funktioniert, da das Datumsformat in einen Zeichendatentyp konvertiert werden kann. COALESCE hingegen löst einen Fehler „Inkonsistenter Datentyp“ aus.

COALESCE akzeptiert mehrere Argumente

Während NVL nur zwei Argumente hat, akzeptiert COALESCE mehrere Argumente. Andererseits hat COALESCE keine NVL2-Funktionalität (wenn x nicht NULL ist, dann y, sonst z). Ein Beispiel mit mehreren Argumenten ist das folgende:

SELECT COALESCE(NULL, NULL, 1, 'Hi') 
FROM DUAL;
-- ORA-00932 "inconsistent datatypes"
SELECT COALESCE(NULL, NULL, 'Hi', 1) 
FROM DUAL;
-- ORA-00932 "inconsistent datatypes"
SELECT COALESCE(NULL, NULL, 'Hi', TO_CHAR(1)) 
FROM DUAL;
-- Result: Hi