Повечето основни 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 вместо грешка.