Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyjaśnienie MySQL NULLIF()

W MySQL, NULLIF() to funkcja kontroli przepływu, która zwraca NULL jeśli oba jego argumenty są równoważne. W przeciwnym razie zwraca pierwszy argument.

Składnia

Składnia wygląda tak:

NULLIF(expr1,expr2)

Przykład

Oto przykład do zademonstrowania:

SELECT NULLIF( 7, 7 );

Wynik:

NULL

W tym przypadku oba argumenty są identyczne, więc wynikiem jest NULL .

Kiedy argumenty nie są równoważne

Oto, co się dzieje, gdy argumenty nie są równoważne:

SELECT NULLIF( 7, 8 );

Wynik:

7

Argumenty są różne, dlatego zwracany jest pierwszy argument.

Struny

Oto przykład porównujący ciągi:

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

Wynik:

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

Daty

Oto przykład porównujący daty:

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

Wynik:

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

Wyrażenia

NULLIF() ocenia bieżącą wartość wyrażeń. Dlatego jeśli przekażemy takie wyrażenie:

SELECT NULLIF( 8, 2 * 4 );

Otrzymujemy to:

NULL

2 pomnożone przez 4 daje 8, więc oba argumenty są równoważne.

Oto, co się stanie, jeśli zmienimy drugi argument:

SELECT NULLIF( 8, 2 * 3 );

Wynik:

8

Zwracany jest pierwszy argument.

Przykład bazy danych

Załóżmy, że uruchamiamy następujące zapytanie:

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

Wynik:

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

Tutaj mamy nazwy krajów w lewej kolumnie, a lokalną nazwę odpowiedniego kraju w prawej.

Dodajmy NULLIF() do trzeciej kolumny naszego zapytania:

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

Wynik:

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

Widzimy, że trzecia kolumna zwraca nazwę lokalną tylko wtedy, gdy jest inna niż wartość w Name kolumna. Jeśli jest taki sam, to NULL jest zwracany.

Możemy również użyć NULLIF() aby filtrować wyniki naszych zapytań:

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

Wynik:

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

W tym przypadku zwróciliśmy tylko te wiersze, w których nazwa lokalna jest inna niż Name kolumna.

NULLIF() vs CASE

Poniższy kod:

NULLIF(expr1,expr2)

jest odpowiednikiem następującego CASE wyrażenie:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Nieprawidłowa liczba parametrów

Przekazanie niewłaściwej liczby argumentów skutkuje błędem:

SELECT NULLIF( 5 );

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przeprowadzić migrację MySQL z Amazon EC2 do lokalnego centrum danych bez przestojów?

  2. Wprowadzanie zmian w wielu rekordach na podstawie zmiany pojedynczego rekordu za pomocą SQL

  3. Jaka jest różnica między BIT i TINYINT w MySQL?

  4. Błąd podczas tworzenia tabeli:Wystąpił błąd w składni SQL w pobliżu 'order( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id ' w wierszu 1

  5. Uzyskaj różnicę lat między dwiema datami w MySQL jako liczbę całkowitą