sql >> Databáze >  >> NoSQL >> MongoDB

SQL COALESCE() Vysvětleno

Většina hlavních RDBMS podporuje COALESCE() operátor, který vrátí první nenulovou hodnotu ze svého seznamu argumentů.

COALESCE() je funkce standardu SQL (je zahrnuta ve specifikaci ISO/IEC 9075).

Syntaxe

Syntaxe vypadá takto:

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

Je tedy vyžadován alespoň jeden argument, ale může být (a obvykle je) poskytnuto více argumentů.

COALESCE() je považováno za n -adic operátor. Jinými slovy, je to operátor, který má proměnný počet operandů (tj. n operandy).

Příklad

Zde je jednoduchý příklad k demonstraci:

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

Výsledek:

Papaya

V tomto případě Papaya byla první nenulová hodnota, a tak COALESCE() vrátil tuto hodnotu.

Salad byla také nenulová hodnota, ale přišla za Papaya a tak to nebylo vráceno.

COALESCE() vs CASE

COALESCE() je obvykle považován za syntaktickou zkratku pro CASE výraz.

Jako takové následující prohlášení:

COALESCE (V1, V2) 

je ekvivalentní:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

A následující prohlášení:

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

(pro n ≥ 3) Je ekvivalentní:

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

Když jsou všechny hodnoty null

Pokud jsou všechny hodnoty null , COALESCE() vrátí null :

SELECT COALESCE( null, null );

Výsledek:

null

V závislosti na vašem RDBMS se může skutečný výstup pro hodnoty null lišit. Například při použití psql (pro PostgreSQL) se ve výchozím nastavení vypíše prázdný řetězec vždy, když se vrátí hodnota null (ačkoli to lze změnit). Je to stejné jako s SQLite (a to lze také změnit).

V SQL Server, pokud jsou všechny argumenty null , pak alespoň jedna z hodnot null musí být zadaná null . Výše uvedený příklad tedy ve skutečnosti vede k chybě (protože všechny argumenty null jsou null konstanty).

Výrazy

COALESCE() vrátí aktuální hodnotu prvního výrazu, který se zpočátku nevyhodnotí jako null . Pokud tedy předáme výraz jako tento:

SELECT COALESCE( null, 3 * 5 );

Dostáváme toto:

15

Příklad databáze

Předpokládejme, že spustíme následující dotaz:

SELECT
  name,
  salary
FROM employee;

A dostaneme následující výsledek:

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

Vidíme, že poslední řádek má v DOB hodnotu null sloupec.

Pokud bychom chtěli hodnotu null nahradit jinou hodnotou, mohli bychom použít COALESCE() takto:

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

Výsledek:

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

V tomto případě jsme nahradili všechny hodnoty null celým číslem 0 .

Rozdíly mezi RDBMS

Obecně COALESCE() funguje v podstatě stejně napříč RDBMS.

Existují však určité rozdíly.

Typy dat

V MySQL, MariaDB a SQLite můžeme provést následující:

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

Výsledek:

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

V tomto případě vždy, když salary sloupec obsahuje hodnotu null, výstup je None .

Ale tento dotaz může způsobit problémy v SQL Server, PostgreSQL nebo Oracle Database.

Když spustím tento dotaz v SQL Server, PostgreSQL a Oracle Database, dostanu chybu, protože náhradní hodnota je nesprávný datový typ.

Zde je to, co SQL Server vrátí, když spustím výše uvedený dotaz:

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

Zde je to, co PostgreSQL vrací:

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

A zde je to, co Oracle Database vrací:

ORA-00932: inconsistent datatypes: expected NUMBER got CHAR

Pokud ale použiji číselnou hodnotu, nezobrazí se mi chyba:

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

Výsledek:

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

Tento poslední příklad tedy funguje ve všech šesti výše uvedených RDBMS.

Nulové argumenty

Další rozdíl mezi tím, jak RDBMS zpracovávají COALESCE() je v tom, jak zacházejí s nulovými argumenty.

Jak bylo zmíněno, v SQL Server, pokud jsou všechny argumenty null , pak alespoň jedna z hodnot null musí být zadaná null . Jinými slovy, pokud jsou všechny argumenty pro COALESCE() jsou nulová konstanta, pak dostaneme chybu. To není případ jiných RDBMS, kde všechny argumenty mohou být nulová konstanta a výstup bude null místo chyby.


  1. Spouštění úloh Heroku na pozadí pouze s 1 webovým dynem a 0 dělnickým dynem

  2. Redis Sentinely s TLS

  3. Jak mohu použít proměnnou regulárního výrazu v dotazu pro MongoDB

  4. Deserializace ID objektu Mongo DB pomocí serializátoru JSON