Was ist das PostgreSQL-Äquivalent zur NVL-Funktion von Oracle?


Beste Antwort

Mit der NVL-Funktion von Oracle können Sie null durch eine Zeichenfolge in den Ergebnissen von a ersetzen Abfrage. Dies ist nützlich, um Nullwerte zu entfernen.

Hier ist die Syntax:

NVL(exp\_to\_check, replacement\_value)

If exp\_to\_check ist null, dann gibt NLV () replacement\_value zurück. Wenn exp\_to\_check nicht null ist, dann NLV () gibt die exp\_to\_check zurück.

Obwohl die COALESCE () -Funktion von PostgreSQL nicht genau übereinstimmt, bietet sie eine sehr ähnliche Funktionalität. Sie akzeptiert eine unbegrenzte Anzahl von Argumenten und Gibt das erste Argument zurück, das nicht null ist. Wenn alle Argumente null sind, gibt die Funktion COALESCE null zurück. Die Syntax lautet:

COALESCE (argument\_1, argument\_2, …)

Hier sind einige grundlegende Beispiele zur Veranschaulichung anhand meines Navicat für PostgreSQL -Datenbankentwicklungsclients:

Verwenden von COALESCE () in einer realen Abfrage

Hier ist ein realistischeres Beispiel unter Verwendung der Sakila-Beispieldatenbank:

Die Adresstabelle enthält ein Adress- und ein Adress2-Feld. Letzteres kann null sein. Wir können diese mit der Funktion COALESCE () durch den Wert „N / A“ ersetzen.

Ich finde es gut, dass der Navicat Query Editor mich anzeigen und sogar die richtige Syntax in meine Abfragen einfügen kann.

Hier ist die vollständige Abfrage und die Ergebnisse:

Sie können sehen, dass die Nulladresse2-Werte konvertiert wurden.

Mit freundlichen Grüßen!

Adam

Antwort

COALESCE

Sicher, NVL ist ein kürzerer Name, aber wissen Sie was?

  • Niemand versteht, wofür NVL steht. Es ist schwer, Noobs zu erklären.
  • NVL akzeptiert nur 2 Argumente, während COALESCE eine beliebige Zahl verwendet
  • COALESCE ist Teil von ANSI-Standard-SQL. Jede SQL-Datenbank unterstützt dies, einschließlich Oracle. Nur Oracle unterstützt NVL (und anscheinend auch Informix; siehe Kommentare).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.