sql >> Database >  >> NoSQL >> MongoDB

SQL COALESCE() uitgelegd

De meeste grote RDBMS'en ondersteunen de COALESCE() operator, die de eerste niet-null-waarde uit de lijst met argumenten retourneert.

COALESCE() is een SQL-standaardfunctie (het is opgenomen in de ISO/IEC 9075-specificatie).

Syntaxis

De syntaxis gaat als volgt:

COALESCE (V1, V2, ..., Vn) 

Er is dus ten minste één argument vereist, maar meerdere argumenten kunnen (en worden meestal) opgegeven.

COALESCE() wordt beschouwd als een n -adische operator. Met andere woorden, het is een operator met een variabel aantal operanden (d.w.z. n operanden).

Voorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren:

SELECT COALESCE(null, 'Papaya', 'Salad'); 

Resultaat:

Papaja

In dit geval Papaya was de eerste niet-null-waarde, en dus COALESCE() heeft die waarde geretourneerd.

Salad was ook een niet-null-waarde, maar deze kwam na Papaya en dus werd het niet teruggestuurd.

COALESCE() vs CASE

COALESCE() wordt doorgaans beschouwd als een syntactische snelkoppeling voor de CASE uitdrukking.

Als zodanig de volgende verklaring:

COALESCE (V1, V2)  

is gelijk aan:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END 

En de volgende verklaring:

COALESCE (V1, V2, ..., Vn) 

(voor n ≥ 3) Is gelijk aan:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END 

Als alle waarden Null zijn

Als alle waarden null zijn , COALESCE() retourneert null :

SELECT COALESCE( null, null ); 

Resultaat:

null

Afhankelijk van uw RDBMS kan de werkelijke uitvoer voor null-waarden verschillen. Als u bijvoorbeeld psql (voor PostgreSQL) gebruikt, wordt de lege tekenreeks standaard uitgevoerd wanneer een null-waarde wordt geretourneerd (hoewel dit kan worden gewijzigd). Het is hetzelfde met SQLite (en dit kan ook worden gewijzigd).

In SQL Server, als alle argumenten null zijn , dan moet ten minste één van de null-waarden een getypte null . zijn . Daarom resulteert het bovenstaande voorbeeld in een fout (omdat alle null-argumenten null zijn) constanten).

Uitdrukkingen

COALESCE() geeft de huidige waarde terug van de eerste uitdrukking die aanvankelijk niet resulteert in null . Daarom, als we een uitdrukking als deze doorgeven:

SELECT COALESCE( null, 3 * 5 ); 

We krijgen dit:

15

Databasevoorbeeld

Stel dat we de volgende query uitvoeren:

SELECT
  name,
  salary
FROM employee; 

En we krijgen het volgende resultaat:

naam | salaris -------+-------- Elise | 100000 Rohit | 50000 Homerus | null

We kunnen zien dat de laatste rij een null-waarde heeft in de DOB kolom.

Als we de null-waarde willen vervangen door een andere waarde, kunnen we COALESCE() gebruiken als volgt:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee; 

Resultaat:

naam | salaris -------+-------- Elise | 100000 Rohit | 50000 Homerus | 0

In dit geval hebben we alle null-waarden vervangen door het gehele getal 0 .

Verschillen tussen RDBMS'en

In het algemeen COALESCE() werkt vrijwel hetzelfde over RDBMS'en.

Maar er zijn enkele verschillen.

Gegevenstypen

We kunnen het volgende doen in MySQL, MariaDB en SQLite:

SELECT
  name,
  COALESCE(salary, 'None') AS salary
FROM employee; 

Resultaat:

naam salaris----- ------Elise 100000Rohit 50000Homer Geen

In dit geval, wanneer het salary kolom een ​​null-waarde bevat, is de uitvoer None .

Maar die query kan problemen veroorzaken in SQL Server, PostgreSQL of Oracle Database.

Wanneer ik die query uitvoer in SQL Server, PostgreSQL en Oracle Database, krijg ik een foutmelding omdat de vervangende waarde het verkeerde gegevenstype is.

Dit is wat SQL Server retourneert als ik de bovenstaande query uitvoer:

Msg 245, Level 16, State 1, Line 15Conversie mislukt bij het converteren van de varchar-waarde 'None' naar datatype int.

Dit is wat PostgreSQL retourneert:

ERROR:ongeldige invoersyntaxis voor type geheel getal:"None"LINE 3:COALESCE(salary, 'None') AS salaris ^

En dit is wat Oracle Database retourneert:

ORA-00932:inconsistente datatypes:verwacht NUMBER kreeg CHAR

Maar als ik een numerieke waarde gebruik, krijg ik de fout niet:

SELECT
  name,
  COALESCE(salary, 0) AS salary
FROM employee; 

Resultaat:

naam | salaris -------+-------- Elise | 100000 Rohit | 50000 Homerus | 0

Dus dit laatste voorbeeld werkt voor alle zes de bovenstaande RDBMS'en.

Nullargumenten

Nog een verschil tussen hoe RDBMS'en COALESCE() verwerken zit in hoe ze omgaan met nulargumenten.

Zoals vermeld, in SQL Server, als alle argumenten null zijn , dan moet ten minste één van de null-waarden een getypte null . zijn . Met andere woorden, als alle argumenten voor COALESCE() zijn de nulconstante, dan krijgen we een fout. Dit is niet het geval bij andere RDBMS'en, waar alle argumenten de nulconstante kunnen zijn en de uitvoer null zal zijn in plaats van een fout.


  1. Mongodb voegt document in zonder _id-veld

  2. Gegevens opvragen uit MongoDB met GraphQL in Django:Get-Go (1)

  3. Hoe ActionController::Leef samen met Resque + Redis (voor Chat-applicatie) te gebruiken

  4. Redis gebruiken om het SQL-resultaat te cachen