В 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'