Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL NULLIF() Обяснено

В MySQL, NULLIF() е функция за контрол на потока, която връща NULL ако и двата му аргумента са еквивалентни. В противен случай връща първия аргумент.

Синтаксис

Синтаксисът е така:

NULLIF(expr1,expr2)

Пример

Ето пример за демонстрация:

SELECT NULLIF( 7, 7 );

Резултат:

NULL

В този случай и двата аргумента са идентични и резултатът е NULL .

Когато аргументите не са еквивалентни

Ето какво се случва, когато аргументите не са еквивалентни:

SELECT NULLIF( 7, 8 );

Резултат:

7

Аргументите са различни и така се връща първият аргумент.

Стрингове

Ето пример, който сравнява низове:

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

Резултат:

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

Дати

Ето пример, който сравнява датите:

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

Резултат:

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

Изрази

NULLIF() оценява текущата стойност на изразите. Следователно, ако предадем израз като този:

SELECT NULLIF( 8, 2 * 4 );

Получаваме това:

NULL

2, умножено по 4, е 8, така че двата аргумента са еквивалентни.

Ето какво се случва, ако променим втория аргумент:

SELECT NULLIF( 8, 2 * 3 );

Резултат:

8

Първият аргумент се връща.

Пример за база данни

Да предположим, че изпълняваме следната заявка:

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

Резултат:

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

Тук имаме имена на държави в лявата колона, а местното име за съответната държава в дясната.

Нека добавим NULLIF() към трета колона на нашата заявка:

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

Резултат:

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

Можем да видим, че третата колона връща локалното име само ако е различно от стойността в Name колона. Ако е същото, тогава NULL се връща.

Можем също да използваме NULLIF() за филтриране на резултатите от нашите заявки:

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

Резултат:

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

В този случай върнахме само онези редове, където локалното име е различно от Name колона.

NULLIF() срещу CASE

Следният код:

NULLIF(expr1,expr2)

е еквивалентен на следния CASE израз:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Неправилен брой параметри

Предаването на грешен брой аргументи води до грешка:

SELECT NULLIF( 5 );

Резултат:

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. Създайте физически архиви на вашите MariaDB или MySQL бази данни

  2. Кога *не* да използвате подготвени изявления?

  3. избиране на уникални стойности от колона

  4. Как да използвам хеширане на пароли с PDO, за да направя кода си по-сигурен?

  5. Производителност на UUID в MySQL?