sql >> Database teknologi >  >> RDS >> Mysql

MySQL NULLIF() Forklaret

I MySQL, NULLIF() er en flowkontrolfunktion, der returnerer NULL hvis begge dets argumenter er ækvivalente. Ellers returnerer det det første argument.

Syntaks

Syntaksen ser sådan ud:

NULLIF(expr1,expr2)

Eksempel

Her er et eksempel til demonstration:

SELECT NULLIF( 7, 7 );

Resultat:

NULL

I dette tilfælde er begge argumenter identiske, så resultatet er NULL .

Når argumenterne ikke er ækvivalente

Her er, hvad der sker, når argumenterne ikke er ækvivalente:

SELECT NULLIF( 7, 8 );

Resultat:

7

Argumenterne er forskellige, og derfor returneres det første argument.

Strenge

Her er et eksempel, der sammenligner strenge:

SELECT 
    NULLIF( 'Bean', 'Bean' ) AS "Same",
    NULLIF( 'Bean', 'Mushroom' ) AS "Different";

Resultat:

Same	Different
----    ---------
NULL	Bean

Datoer

Her er et eksempel, der sammenligner datoer:

SELECT 
    NULLIF( DATE '2030-12-20', DATE '2030-12-20' ) AS "Same",
    NULLIF( DATE '2030-12-20', DATE '2035-08-15' ) AS "Different";

Resultat:

Same	Different
----    ----------
NULL	2030-12-20

Udtryk

NULLIF() evaluerer den aktuelle værdi af udtrykkene. Derfor, hvis vi sender et udtryk som dette:

SELECT NULLIF( 8, 2 * 4 );

Vi får dette:

NULL

2 ganget med 4 er 8, så de to argumenter er ækvivalente.

Her er, hvad der sker, hvis vi ændrer det andet argument:

SELECT NULLIF( 8, 2 * 3 );

Resultat:

8

Det første argument returneres.

Et databaseeksempel

Antag, at vi kører følgende forespørgsel:

SELECT 
    Name,
    LocalName
FROM country 
WHERE Region = 'Southern Europe'
ORDER BY Name;

Resultat:

+-------------------------------+--------------------------------+
| Name                          | LocalName                      |
+-------------------------------+--------------------------------+
| Albania                       | Shqipëria                      |
| Andorra                       | Andorra                        |
| Bosnia and Herzegovina        | Bosna i Hercegovina            |
| Croatia                       | Hrvatska                       |
| Gibraltar                     | Gibraltar                      |
| Greece                        | Elláda                         |
| Holy See (Vatican City State) | Santa Sede/Città del Vaticano  |
| Italy                         | Italia                         |
| Macedonia                     | Makedonija                     |
| Malta                         | Malta                          |
| Portugal                      | Portugal                       |
| San Marino                    | San Marino                     |
| Slovenia                      | Slovenija                      |
| Spain                         | España                         |
| Yugoslavia                    | Jugoslavija                    |
+-------------------------------+--------------------------------+

Her har vi landenavne i venstre kolonne, og det lokale navn for det respektive land i højre.

Lad os tilføje NULLIF() til en tredje kolonne i vores forespørgsel:

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

Resultat:

+-------------------------------+--------------------------------+--------------------------------+
| Name                          | LocalName                      | Local Name if Different        |
+-------------------------------+--------------------------------+--------------------------------+
| Albania                       | Shqipëria                      | Shqipëria                      |
| Andorra                       | Andorra                        | NULL                           |
| Bosnia and Herzegovina        | Bosna i Hercegovina            | Bosna i Hercegovina            |
| Croatia                       | Hrvatska                       | Hrvatska                       |
| Gibraltar                     | Gibraltar                      | NULL                           |
| Greece                        | Elláda                         | Elláda                         |
| Holy See (Vatican City State) | Santa Sede/Città del Vaticano  | Santa Sede/Città del Vaticano  |
| Italy                         | Italia                         | Italia                         |
| Macedonia                     | Makedonija                     | Makedonija                     |
| Malta                         | Malta                          | NULL                           |
| Portugal                      | Portugal                       | NULL                           |
| San Marino                    | San Marino                     | NULL                           |
| Slovenia                      | Slovenija                      | Slovenija                      |
| Spain                         | España                         | España                         |
| Yugoslavia                    | Jugoslavija                    | Jugoslavija                    |
+-------------------------------+--------------------------------+--------------------------------+

Vi kan se, at den tredje kolonne kun returnerer det lokale navn, hvis det er forskelligt fra værdien i Name kolonne. Hvis det er det samme, så NULL er returneret.

Vi kan også bruge NULLIF() for at filtrere vores forespørgselsresultater:

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

Resultat:

+-------------------------------+--------------------------------+
| Name                          | LocalName                      |
+-------------------------------+--------------------------------+
| Albania                       | Shqipëria                      |
| Bosnia and Herzegovina        | Bosna i Hercegovina            |
| Croatia                       | Hrvatska                       |
| Greece                        | Elláda                         |
| Holy See (Vatican City State) | Santa Sede/Città del Vaticano  |
| Italy                         | Italia                         |
| Macedonia                     | Makedonija                     |
| Slovenia                      | Slovenija                      |
| Spain                         | España                         |
| Yugoslavia                    | Jugoslavija                    |
+-------------------------------+--------------------------------+

I dette tilfælde returnerede vi kun de rækker, hvor det lokale navn er forskelligt fra Name kolonne.

NULLIF() vs CASE

Følgende kode:

NULLIF(expr1,expr2)

svarer til følgende CASE udtryk:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Forkert parameterantal

Sender det forkerte antal argumenter, resulterer det i en fejl:

SELECT NULLIF( 5 );

Resultat:

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

  1. Sum værdier af multidimensional matrix for nøgle uden sløjfe

  2. Langsomhed fundet, når base 64-billede vælger og koder fra databasen

  3. Sådan bruger du Oracle SQL*Plus

  4. Databasenavngivningskonventioner fra Microsoft?