Повечето основни RDBMS поддържат COALESCE()
оператор, който връща първата ненулева стойност от своя списък с аргументи.
COALESCE()
е стандартна функция на SQL (включена е в спецификацията ISO/IEC 9075).
Синтаксис
Синтаксисът е така:
COALESCE (V1, V2, ..., Vn)
Така че е необходим поне един аргумент, но могат да бъдат предоставени (и обикновено са) множество аргументи.
COALESCE()
се счита за n -адичен оператор. С други думи, това е оператор, който има променлив брой операнди (т.е. n операнди).
Пример
Ето един прост пример за демонстрация:
SELECT COALESCE(null, 'Papaya', 'Salad');
Резултат:
Papaya
В този случай Papaya
беше първата ненулева стойност и така COALESCE()
върна тази стойност.
Salad
също беше ненулева стойност, но дойде след Papaya
и затова не беше върнато.
COALESCE()
срещу CASE
COALESCE()
обикновено се счита за синтактичен пряк път за CASE
изразяване.
Като такъв, следното изявление:
COALESCE (V1, V2)
е еквивалентен на:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
И следното изявление:
COALESCE (V1, V2, ..., Vn)
(за n ≥ 3) Еквивалентно на:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
Когато всички стойности са нула
Ако всички стойности са null
, COALESCE()
връща null
:
SELECT COALESCE( null, null );
Резултат:
null
В зависимост от вашата RDBMS, действителният изход за нулеви стойности може да е различен. Например, когато използвате psql (за PostgreSQL), празният низ се извежда по подразбиране всеки път, когато се върне нулева стойност (въпреки че това може да бъде променено). Същото е и със SQLite (и това също може да бъде променено).
В SQL Server, ако всички аргументи са null
, тогава поне една от нулевите стойности трябва да бъде въведен null
. Следователно горният пример всъщност води до грешка (тъй като всички нулеви аргументи са null
константи).
Изрази
COALESCE()
връща текущата стойност на първия израз, който първоначално не се оценява на null
. Следователно, ако предадем израз като този:
SELECT COALESCE( null, 3 * 5 );
Получаваме това:
15
Пример за база данни
Да предположим, че изпълняваме следната заявка:
SELECT
name,
salary
FROM employee;
И получаваме следния резултат:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | null
Можем да видим, че последният ред има нулева стойност в DOB
колона.
Ако искаме да заменим нулевата стойност с друга стойност, можем да използваме COALESCE()
както следва:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Резултат:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
В този случай заменихме всички нулеви стойности с цяло число 0
.
Разлики между RDBMS
Като цяло, COALESCE()
работи почти по същия начин в RDBMS.
Но има някои разлики.
Типове данни
Можем да направим следното в MySQL, MariaDB и SQLite:
SELECT
name,
COALESCE(salary, 'None') AS salary
FROM employee;
Резултат:
name salary ----- ------ Elise 100000 Rohit 50000 Homer None
В този случай винаги, когато salary
колоната съдържа нулева стойност, изходът е None
.
Но тази заявка може да причини проблеми в SQL Server, PostgreSQL или Oracle Database.
Когато стартирам тази заявка в SQL Server, PostgreSQL и Oracle Database, получавам грешка, тъй като заместващата стойност е грешен тип данни.
Ето какво връща SQL Server, когато изпълня горната заявка:
Msg 245, Level 16, State 1, Line 15 Conversion failed when converting the varchar value 'None' to data type int.
Ето какво връща PostgreSQL:
ERROR: invalid input syntax for type integer: "None" LINE 3: COALESCE(salary, 'None') AS salary ^
И ето какво връща Oracle Database:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
Но ако използвам числова стойност, не получавам грешката:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Резултат:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Така че този последен пример работи във всичките шест от горните RDBMS.
Нулеви аргументи
Друга разлика между начина, по който RDBMS обработват COALESCE()
е в това как се справят с нулеви аргументи.
Както споменахме, в SQL Server, ако всички аргументи са null
, тогава поне една от нулевите стойности трябва да бъде въведен null
. С други думи, ако всички аргументи към COALESCE()
са нулевата константа, тогава получаваме грешка. Това не е така с други RDBMS, където всички аргументи могат да бъдат нулева константа, а изходът ще бъде null
вместо грешка.