sql >> Databasteknik >  >> RDS >> Mysql

MySQL NULLIF() Förklarat

I MySQL, NULLIF() är en flödeskontrollfunktion som returnerar NULL om båda dess argument är likvärdiga. Annars returnerar det det första argumentet.

Syntax

Syntaxen ser ut så här:

NULLIF(expr1,expr2)

Exempel

Här är ett exempel att visa:

SELECT NULLIF( 7, 7 );

Resultat:

NULL

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

När argumenten inte är likvärdiga

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

SELECT NULLIF( 7, 8 );

Resultat:

7

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( 'Bean', 'Bean' ) AS "Same",
    NULLIF( 'Bean', 'Mushroom' ) AS "Different";

Resultat:

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

Datum

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

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

Uttryck

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

SELECT NULLIF( 8, 2 * 4 );

Vi får detta:

NULL

2 multiplicerat med 4 är 8, så de två argumenten är ekvivalenta.

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

SELECT NULLIF( 8, 2 * 3 );

Resultat:

8

Det första argumentet returneras.

Ett databasexempel

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

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

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 = '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 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 = '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 det här fallet returnerade vi bara de rader där det lokala namnet skiljer sig från Name kolumn.

NULLIF() kontra CASE

Följande kod:

NULLIF(expr1,expr2)

motsvarar följande CASE uttryck:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Felaktig parameterräkning

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

SELECT NULLIF( 5 );

Resultat:

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

  1. Fyll en sträng med inledande nollor så att den är 3 tecken lång i SQL Server 2008

  2. PostgreSQL -måste visas i GROUP BY-satsen eller användas i en aggregerad funktion

  3. Dumpa en mysql-databas till en klartext (CSV) säkerhetskopia från kommandoraden

  4. Skillnaden mellan ON- och WHERE-satser i SQL-tabellen ansluter