MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wyjaśnienie SQL COALESCE()

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jaki jest pożytek z Jade lub Handlebars podczas pisania aplikacji AngularJs

  2. Jak wypada porównanie danych Morphia, Mongo4j i Spring dla MongoDB?

  3. Mieszanie PostgreSQL i MongoDB (jako backendy Django)

  4. MongoDB zmienia nazwę pola bazy danych w tablicy

  5. Dane sprężyny Dopasuj i filtruj zagnieżdżoną tablicę