sql >> Databasteknik >  >> NoSQL >> MongoDB

SQL NULLIF() Förklarat

De flesta större RDBMS:er stöder NULLIF() operator, som returnerar NULL om båda dess argument är likvärdiga. Om argumenten inte är likvärdiga, NULLIF() returnerar det första argumentet.

NULLIF() är en SQL-standardfunktion (den ingår i ISO/IEC 9075-specifikationen).

Syntax

Syntaxen ser ut så här:

NULLIF (V1, V2)

Detta motsvarar följande CASE uttryck:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Exempel

Här är ett exempel att visa:

SELECT NULLIF( 12, 12 );

Resultat:

NULL

I det här fallet är båda argumenten identiska och därför är resultatet NULL .

Beroende på din RDBMS kan den faktiska utdatan för NULL-värden vara annorlunda. Till exempel, när du använder psql (för PostgreSQL), matas den tomma strängen ut som standard när ett NULL-värde returneras (även om detta kan ändras). Det är samma sak med SQLite (och detta kan också ändras).

När argumenten inte är likvärdiga

Så här händer när argumenten inte är likvärdiga:

SELECT NULLIF( 12, 13 );

Resultat:

12

Argumenten är olika och därför returneras det första argumentet.

Strängar

Här är ett exempel som jämför strängar:

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

Resultat:

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

Datum

Här är ett exempel som jämför datum:

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

Resultat:

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

Uttryck

NULLIF() utvärderar det aktuella värdet av uttrycken. Därför, om vi skickar ett uttryck som detta:

SELECT NULLIF( 24, 2 * 12 );

Vi får detta:

NULL

2 multiplicerat med 12 är 24, så de två argumenten är ekvivalenta.

Så här händer om vi ändrar det andra argumentet:

SELECT NULLIF( 24, 3 * 12 );

Resultat:

24

Det första argumentet returneras.

Ett databasexempel

Anta att vi kör följande fråga:

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

Resultat:

+------------------+-------------------+
| 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         |
+------------------+-------------------+

Här har vi landsnamn i den vänstra kolumnen och det lokala namnet för respektive land i den högra.

Låt oss lägga till NULLIF() till en tredje kolumn i vår fråga:

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

Resultat:

+------------------+-------------------+-------------------------+
| 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                    |
+------------------+-------------------+-------------------------+

Vi kan se att den tredje kolumnen endast returnerar det lokala namnet om det skiljer sig från värdet i Name kolumn. Om det är samma, då NULL returneras.

Vi kan också använda NULLIF() för att filtrera våra sökresultat:

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

Resultat:

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

I det här fallet returnerade vi bara de rader där det lokala namnet skiljer sig från Name kolumn.

NULLIF() kontra CASE

Som nämnt, följande kod:

NULLIF (V1, V2)

motsvarar följande CASE uttryck:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Så det är möjligt att använda en CASE uttryck istället för NULLIF() om så önskas. NULLIF() funktion är i grunden en syntaktisk genväg för CASE uttryck.

Så till exempel kan vi ersätta det föregående exemplet med följande:

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;

Resultat:

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

Men NULLIF() funktion är mycket mer kortfattad.

Felaktig parameterräkning

Om du skickar fel antal argument, resulterar det i ett fel:

SELECT NULLIF( 'One' );

Resultat i MySQL:

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

  1. Hur utför man Persistence Store i Redis?

  2. MongoDB 2.1 Aggregate Framework Summa av matriselement som matchar ett namn

  3. Hur exporterar/dumpar jag mongodb-databasen?

  4. MongoDB Säkerhetskopiering och återställning