sql >> Database >  >> NoSQL >> MongoDB

SQL NULLIF() uitgelegd

De meeste grote RDBMS'en ondersteunen de NULLIF() operator, die NULL returns teruggeeft als beide argumenten equivalent zijn. Als de argumenten niet equivalent zijn, NULLIF() geeft het eerste argument terug.

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

Syntaxis

De syntaxis gaat als volgt:

NULLIF (V1, V2)

Dit komt overeen met het volgende CASE uitdrukking:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Voorbeeld

Hier is een voorbeeld om te demonstreren:

SELECT NULLIF( 12, 12 );

Resultaat:

NULL

In dit geval zijn beide argumenten identiek en is het 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).

Als de argumenten niet gelijkwaardig zijn

Dit is wat er gebeurt als de argumenten niet equivalent zijn:

SELECT NULLIF( 12, 13 );

Resultaat:

12

De argumenten zijn verschillend en dus wordt het eerste argument geretourneerd.

Snaren

Hier is een voorbeeld dat strings vergelijkt:

SELECT 
    NULLIF( 'Gym', 'Gym' ) AS "Same",
    NULLIF( 'Gym', 'Bag' ) AS "Different";

Resultaat:

+------+-----------+
| Same | Different |
+------+-----------+
| NULL | Gym       |
+------+-----------+

Datums

Hier is een voorbeeld dat datums vergelijkt:

SELECT 
    NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
    NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";

Resultaat:

+------+------------+
| Same | Different  |
+------+------------+
| NULL | 2045-11-25 |
+------+------------+

Uitdrukkingen

NULLIF() evalueert de huidige waarde van de uitdrukkingen. Daarom, als we een uitdrukking als deze doorgeven:

SELECT NULLIF( 24, 2 * 12 );

We krijgen dit:

NULL

2 vermenigvuldigd met 12 is 24, en dus zijn de twee argumenten equivalent.

Dit is wat er gebeurt als we het tweede argument veranderen:

SELECT NULLIF( 24, 3 * 12 );

Resultaat:

24

Het eerste argument wordt geretourneerd.

Een databasevoorbeeld

Stel dat we de volgende query uitvoeren:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
ORDER BY Name;

Resultaat:

+------------------+-------------------+
| Name             | LocalName         |
+------------------+-------------------+
| Argentina        | Argentina         |
| Bolivia          | Bolivia           |
| Brazil           | Brasil            |
| Chile            | Chile             |
| Colombia         | Colombia          |
| Ecuador          | Ecuador           |
| Falkland Islands | Falkland Islands  |
| French Guiana    | Guyane française  |
| Guyana           | Guyana            |
| Paraguay         | Paraguay          |
| Peru             | Perú/Piruw        |
| Suriname         | Suriname          |
| Uruguay          | Uruguay           |
| Venezuela        | Venezuela         |
+------------------+-------------------+

Hier hebben we landnamen in de linkerkolom en de lokale naam voor het betreffende land in de rechterkolom.

Laten we NULLIF() . toevoegen naar een derde kolom van onze zoekopdracht:

SELECT
    Name,
    LocalName,
    NULLIF(LocalName, Name) AS "Local Name if Different"
FROM country 
WHERE Region = 'South America'
ORDER BY Name;

Resultaat:

+------------------+-------------------+-------------------------+
| Name             | LocalName         | Local Name if Different |
+------------------+-------------------+-------------------------+
| Argentina        | Argentina         | NULL                    |
| Bolivia          | Bolivia           | NULL                    |
| Brazil           | Brasil            | Brasil                  |
| Chile            | Chile             | NULL                    |
| Colombia         | Colombia          | NULL                    |
| Ecuador          | Ecuador           | NULL                    |
| Falkland Islands | Falkland Islands  | NULL                    |
| French Guiana    | Guyane française  | Guyane française        |
| Guyana           | Guyana            | NULL                    |
| Paraguay         | Paraguay          | NULL                    |
| Peru             | Perú/Piruw        | Perú/Piruw              |
| Suriname         | Suriname          | NULL                    |
| Uruguay          | Uruguay           | NULL                    |
| Venezuela        | Venezuela         | NULL                    |
+------------------+-------------------+-------------------------+

We kunnen zien dat de derde kolom de lokale naam alleen retourneert als deze verschilt van de waarde in de Name kolom. Als het hetzelfde is, dan NULL wordt geretourneerd.

We kunnen ook NULLIF() . gebruiken om onze zoekopdrachtresultaten te filteren:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
AND NULLIF(LocalName, Name) IS NOT NULL
ORDER BY Name;

Resultaat:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

In dit geval hebben we alleen die rijen geretourneerd waar de lokale naam anders is dan de Name kolom.

NULLIF() vs CASE

Zoals vermeld, de volgende code:

NULLIF (V1, V2)

is gelijk aan het volgende CASE uitdrukking:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Het is dus mogelijk om een ​​CASE . te gebruiken uitdrukking in plaats van NULLIF() indien gewenst. De NULLIF() functie is in feite een syntactische snelkoppeling voor de CASE uitdrukking.

We zouden bijvoorbeeld het vorige voorbeeld kunnen vervangen door het volgende:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'South America'
AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
ORDER BY Name;

Resultaat:

+---------------+-------------------+
| Name          | LocalName         |
+---------------+-------------------+
| Brazil        | Brasil            |
| French Guiana | Guyane française  |
| Peru          | Perú/Piruw        |
+---------------+-------------------+

Echter, de NULLIF() functie is veel beknopter.

Onjuist aantal parameters

Het verkeerde aantal argumenten doorgeven, resulteert in een fout:

SELECT NULLIF( 'One' );

Resultaat in MySQL:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'

  1. Hoe kunnen we een automatisch gegenereerd veld voor mongodb maken met springboot?

  2. wat is de beste strategie om gegevens tussen DB en redis-cache te synchroniseren?

  3. Hoe kan ik terugdraaien in transacties in mongo bereiken?

  4. Toegang tot redis lokaal op docker - docker compose