Większość głównych RDBMS obsługuje COALESCE()
operator, który zwraca pierwszą niepustą wartość ze swojej listy argumentów.
COALESCE()
to standardowa funkcja SQL (zawarta w specyfikacji ISO/IEC 9075).
Składnia
Składnia wygląda tak:
COALESCE (V1, V2, ..., Vn)
Tak więc wymagany jest co najmniej jeden argument, ale można podać wiele argumentów (i zwykle jest).
COALESCE()
jest uważany za n -adyczny operator. Innymi słowy, jest to operator, który ma zmienną liczbę operandów (np. n operandy).
Przykład
Oto prosty przykład do zademonstrowania:
SELECT COALESCE(null, 'Papaya', 'Salad');
Wynik:
Papaya
W tym przypadku Papaya
była pierwszą wartością inną niż null, więc COALESCE()
zwrócił tę wartość.
Salad
była również wartością inną niż null, ale pojawiła się po Papaya
więc nie został zwrócony.
COALESCE()
vs CASE
COALESCE()
jest zwykle uważany za skrót składniowy dla CASE
wyrażenie.
W związku z tym następujące oświadczenie:
COALESCE (V1, V2)
jest równoważne z:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
Oraz następujące oświadczenie:
COALESCE (V1, V2, ..., Vn)
(dla n ≥ 3) Jest równoważne:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
Gdy wszystkie wartości są zerowe
Jeśli wszystkie wartości są null
, COALESCE()
zwraca null
:
SELECT COALESCE( null, null );
Wynik:
null
W zależności od RDBMS rzeczywiste dane wyjściowe dla wartości null mogą być różne. Na przykład podczas korzystania z psql (dla PostgreSQL), pusty ciąg jest domyślnie wyprowadzany za każdym razem, gdy zwracana jest wartość null (chociaż można to zmienić). Tak samo jest z SQLite (i to również można zmienić).
W SQL Server, jeśli wszystkie argumenty są null
, to co najmniej jedna z wartości null musi być wpisanym null
. Dlatego powyższy przykład faktycznie skutkuje błędem (ponieważ wszystkie puste argumenty są null
stałe).
Wyrażenia
COALESCE()
zwraca bieżącą wartość pierwszego wyrażenia, które początkowo nie ma wartości null
. Dlatego jeśli przekażemy takie wyrażenie:
SELECT COALESCE( null, 3 * 5 );
Otrzymujemy to:
15
Przykład bazy danych
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT
name,
salary
FROM employee;
I otrzymujemy następujący wynik:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | null
Widzimy, że ostatni wiersz ma wartość null w DOB
kolumna.
Gdybyśmy chcieli zastąpić wartość null inną wartością, moglibyśmy użyć COALESCE()
w następujący sposób:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Wynik:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
W tym przypadku zastąpiliśmy wszystkie wartości null liczbą całkowitą 0
.
Różnice między RDBMS
Ogólnie rzecz biorąc, COALESCE()
działa prawie tak samo w systemach RDBMS.
Ale są pewne różnice.
Typy danych
W MySQL, MariaDB i SQLite możemy wykonać następujące czynności:
SELECT
name,
COALESCE(salary, 'None') AS salary
FROM employee;
Wynik:
name salary ----- ------ Elise 100000 Rohit 50000 Homer None
W takim przypadku, gdy salary
kolumna zawiera wartość null, wynik to None
.
Ale to zapytanie może powodować problemy w SQL Server, PostgreSQL lub Oracle Database.
Kiedy uruchamiam to zapytanie w SQL Server, PostgreSQL i Oracle Database, otrzymuję błąd, ponieważ wartość zastępcza jest niewłaściwym typem danych.
Oto, co zwraca SQL Server po uruchomieniu powyższego zapytania:
Msg 245, Level 16, State 1, Line 15 Conversion failed when converting the varchar value 'None' to data type int.
Oto, co zwraca PostgreSQL:
ERROR: invalid input syntax for type integer: "None" LINE 3: COALESCE(salary, 'None') AS salary ^
A oto, co zwraca Oracle Database:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
Ale jeśli użyję wartości liczbowej, nie otrzymuję błędu:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Wynik:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Więc ten ostatni przykład działa we wszystkich sześciu powyższych RDBMS.
Argumenty zerowe
Kolejna różnica między tym, jak RDBMS przetwarzają COALESCE()
jest sposób, w jaki radzą sobie z argumentami zerowymi.
Jak wspomniano, w SQL Server, jeśli wszystkie argumenty są null
, co najmniej jedna z wartości null musi być wpisanym null
. Innymi słowy, jeśli wszystkie argumenty COALESCE()
są stałą pustą, to otrzymujemy błąd. Inaczej jest w przypadku innych RDBMS, gdzie wszystkie argumenty mogą być stałą null, a wyjściem będzie null
zamiast błędu.