MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

SQL COALESCE() Обяснено

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да осигурим уникален елемент в масив, базиран на конкретни полета - mongoDB?

  2. Как да намерите неизползвани индекси в MongoDB?

  3. Как да използвам променлива като име на поле в mongodb-native findOne()?

  4. Има ли еквивалент на NOW() в MongoDB

  5. MongoDB - Създайте резервно копие