Gibt es nicht offensichtliche Unterschiede zwischen NVL und Coalesce in Oracle?
Die offensichtlichen Unterschiede bestehen darin, dass Coalesce das erste Nicht-Null-Element in seiner Parameterliste zurückgibt, während nvl nur zwei Parameter verwendet und den ersten zurückgibt, wenn es nicht Null ist, andernfalls den zweiten.
Es scheint, dass NVL nur eine "Base Case" -Version von Coalesce ist.
Vermisse ich etwas
Antworten:
COALESCE
ist eine modernere Funktion, die Teil desANSI-92
Standards ist.NVL
istOracle
spezifisch, es wurde in eingeführt80
, bevor es irgendwelche Standards gab.Bei zwei Werten handelt es sich um Synonyme.
Sie sind jedoch unterschiedlich implementiert.
NVL
wertet immer beide Argumente aus, währendCOALESCE
normalerweise die Auswertung gestoppt wird, wenn das erste Nicht- gefunden wirdNULL
(es gibt einige Ausnahmen, wie z. B. die ReihenfolgeNEXTVAL
):Dies läuft fast
0.5
Sekunden, da esSYS_GUID()
's generiert , obwohl1
es kein a istNULL
.Dies versteht, dass dies
1
kein a istNULL
und bewertet das zweite Argument nicht.SYS_GUID
werden nicht generiert und die Abfrage erfolgt sofort.quelle
NVL führt eine implizite Konvertierung in den Datentyp des ersten Parameters durch, sodass der folgende Fehler nicht auftritt
COALESCE erwartet konsistente Datentypen.
wird einen 'inkonsistenten Datentypfehler' auslösen
quelle
NVL und COALESCE werden verwendet, um die gleiche Funktionalität wie bei der Bereitstellung eines Standardwerts zu erreichen, falls die Spalte NULL zurückgibt.
Die Unterschiede sind:
Beispiele für den dritten Fall. Andere Fälle sind einfach.
select nvl('abc',10) from dual;
würde funktionieren, da NVL eine implizite Konvertierung von numerischen 10 in Zeichenfolgen durchführt.select coalesce('abc',10) from dual;
schlägt mit Fehler fehl - inkonsistente Datentypen: erwartet CHAR hat NUMBERBeispiel für den UNION-Anwendungsfall
scheitert mit
ORA-00932: inconsistent datatypes: expected CHAR got DATE
gelingt es.
Weitere Informationen: http://www.plsqlinformation.com/2016/04/difference-between-nvl-and-coalesce-in-oracle.html
quelle
Es gibt auch Unterschiede in der Planabwicklung.
Oracle kann einen optimierten Plan mit Verkettung von Verzweigungsfiltern erstellen, wenn die Suche einen Vergleich des
nvl
Ergebnisses mit einer indizierten Spalte enthält.nvl:
verschmelzen:
Credits finden Sie unter http://www.xt-r.com/2012/03/nvl-coalesce-concatenation.html .
quelle
Ein weiterer Beweis dafür, dass coalesce () die Auswertung mit dem ersten Nicht-Null-Wert nicht beendet:
Führen Sie dies aus und überprüfen Sie es
my_sequence.currval;
quelle
Eigentlich kann ich nicht jeder Aussage zustimmen.
"COALESCE erwartet, dass alle Argumente denselben Datentyp haben."
Das ist falsch, siehe unten. Argumente können unterschiedliche Datentypen sein, was auch dokumentiert ist : Wenn alle Vorkommen von expr ein numerischer Datentyp oder ein nicht numerischer Datentyp sind, der implizit in einen numerischen Datentyp konvertiert werden kann, bestimmt Oracle Database implizit das Argument mit der höchsten numerischen Priorität konvertiert die verbleibenden Argumente in diesen Datentyp und gibt diesen Datentyp zurück. . Tatsächlich steht dies sogar im Widerspruch zum allgemeinen Ausdruck "COALESCE stoppt beim ersten Auftreten eines Nicht-Null-Werts", andernfalls sollte Testfall Nr. 4 keinen Fehler auslösen.
Auch nach Testfall Nr. 5
COALESCE
erfolgt eine implizite Konvertierung von Argumenten.quelle
Obwohl dies offensichtlich ist und sogar von Tom erwähnt wird, der diese Frage gestellt hat. Aber lassen Sie uns noch einmal aufstellen.
NVL kann nur 2 Argumente haben. Coalesce kann mehr als 2 haben.
select nvl('','',1) from dual;
// Ergebnis ::ORA-00909
ungültige Anzahl von Argumentenselect coalesce('','','1') from dual;
// Ausgabe: gibt 1 zurückquelle
NVL: Ersetzen Sie die Null durch den Wert.
COALESCE: Gibt den ersten Nicht-Null-Ausdruck aus der Ausdrucksliste zurück.
Tabelle: PRICE_LIST
Unten sehen Sie das Beispiel für
[1] Festlegen des Verkaufspreises mit einem Gewinn von 10% für alle Produkte.
[2] Wenn es keinen Kauflistenpreis gibt, ist der Verkaufspreis der Mindestpreis. Für den Ausverkauf.
[3] Wenn es auch keinen Mindestpreis gibt, setzen Sie den Verkaufspreis als Standardpreis "50".
Erklären Sie anhand eines praktischen Beispiels aus dem wirklichen Leben.
Sie können sehen, dass wir mit NVL Regeln erreichen können [1], [2]
Aber mit COALSECE können wir alle drei Regeln erreichen.
quelle
NVL(Purchase_Price + (Purchase_Price * 0.10), nvl(Min_Price,50))
. Oder über:nvl(NVL(Purchase_Price + (Purchase_Price * 0.10), Min_Price) ,50)
:)