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.