MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

SQL COALESCE() erklärt

Die meisten großen RDBMSs unterstützen COALESCE() -Operator, der den ersten Nicht-Null-Wert aus seiner Argumentliste zurückgibt.

COALESCE() ist eine SQL-Standardfunktion (in der ISO/IEC 9075-Spezifikation enthalten).

Syntax

Die Syntax lautet wie folgt:

COALESCE (V1, V2, ..., Vn)

Daher ist mindestens ein Argument erforderlich, es können jedoch mehrere Argumente angegeben werden (und werden dies normalerweise auch getan).

COALESCE() wird als n angesehen -adischer Operator. Mit anderen Worten, es ist ein Operator, der eine variable Anzahl von Operanden hat (d. h. n Operanden).

Beispiel

Hier ist ein einfaches Beispiel zur Veranschaulichung:

SELECT COALESCE(null, 'Papaya', 'Salad');

Ergebnis:

Papaya

In diesem Fall Papaya war der erste Nicht-Null-Wert, also COALESCE() diesen Wert zurückgegeben.

Salad war ebenfalls ein Nicht-Null-Wert, kam aber nach Papaya und so wurde es nicht zurückgegeben.

COALESCE() vs. CASE

COALESCE() wird normalerweise als syntaktische Abkürzung für CASE angesehen Ausdruck.

Daher die folgende Anweisung:

COALESCE (V1, V2) 

entspricht:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

Und die folgende Anweisung:

COALESCE (V1, V2, ..., Vn)

(für n ≥ 3) Entspricht:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END

Wenn alle Werte Null sind

Wenn alle Werte null sind , COALESCE() gibt null zurück :

SELECT COALESCE( null, null );

Ergebnis:

null

Abhängig von Ihrem RDBMS kann die tatsächliche Ausgabe für Nullwerte unterschiedlich sein. Beispielsweise wird bei der Verwendung von psql (für PostgreSQL) standardmäßig immer dann der leere String ausgegeben, wenn ein Nullwert zurückgegeben wird (dies kann jedoch geändert werden). Dasselbe gilt für SQLite (und das kann auch geändert werden).

In SQL Server, wenn alle Argumente null sind , dann muss mindestens einer der Nullwerte ein typisierter null sein . Daher führt das obige Beispiel tatsächlich zu einem Fehler (weil alle Nullargumente null sind Konstanten).

Ausdrücke

COALESCE() gibt den aktuellen Wert des ersten Ausdrucks zurück, der anfänglich nicht zu null ausgewertet wird . Wenn wir also einen Ausdruck wie diesen übergeben:

SELECT COALESCE( null, 3 * 5 );

Wir bekommen das:

15

Datenbankbeispiel

Angenommen, wir führen die folgende Abfrage aus:

SELECT
  name,
  salary
FROM employee;

Und wir erhalten das folgende Ergebnis:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |   null

Wir können sehen, dass die letzte Zeile im DOB einen Nullwert hat Säule.

Wenn wir den Nullwert durch einen anderen Wert ersetzen wollten, könnten wir COALESCE() verwenden wie folgt:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee;

Ergebnis:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |      0

In diesem Fall haben wir alle Nullwerte durch die Ganzzahl 0 ersetzt .

Unterschiede zwischen RDBMSs

Im Allgemeinen COALESCE() funktioniert in allen RDBMSs ziemlich gleich.

Aber es gibt einige Unterschiede.

Datentypen

Wir können Folgendes in MySQL, MariaDB und SQLite tun:

SELECT
  name,
  COALESCE(salary, 'None') AS salary
FROM employee;

Ergebnis:

name	salary
-----   ------
Elise	100000
Rohit	50000
Homer	None

In diesem Fall immer dann, wenn das salary Spalte einen Nullwert enthält, ist die Ausgabe None .

Diese Abfrage kann jedoch Probleme in SQL Server, PostgreSQL oder Oracle Database verursachen.

Wenn ich diese Abfrage in SQL Server, PostgreSQL und Oracle Database ausführe, erhalte ich eine Fehlermeldung, weil der Ersatzwert den falschen Datentyp hat.

Folgendes gibt SQL Server zurück, wenn ich die obige Abfrage ausführe:

Msg 245, Level 16, State 1, Line 15
Conversion failed when converting the varchar value 'None' to data type int.

Folgendes gibt PostgreSQL zurück:

ERROR:  invalid input syntax for type integer: "None"
LINE 3:   COALESCE(salary, 'None') AS salary
                           ^

Und hier ist, was Oracle Database zurückgibt:

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

Aber wenn ich einen numerischen Wert verwende, bekomme ich nicht den Fehler:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee;

Ergebnis:

 name  | salary 
-------+--------
 Elise | 100000
 Rohit |  50000
 Homer |      0

Dieses letzte Beispiel funktioniert also in allen sechs der oben genannten RDBMS.

Null-Argumente

Ein weiterer Unterschied zwischen der Verarbeitung von COALESCE() durch RDBMS liegt darin, wie sie mit Nullargumenten umgehen.

Wie bereits erwähnt, in SQL Server, wenn alle Argumente null sind , dann muss mindestens einer der Nullwerte ein typisierter null sein . Mit anderen Worten, wenn alle Argumente zu COALESCE() die Nullkonstante sind, erhalten wir einen Fehler. Dies ist bei anderen RDBMSs nicht der Fall, bei denen alle Argumente die Nullkonstante sein können und die Ausgabe null ist anstelle eines Fehlers.