В MariaDB, NULLIF() функцията връща NULL ако и двата му аргумента са еквивалентни. В противен случай връща първия аргумент.
Синтаксис
Синтаксисът е така:
NULLIF(expr1,expr2) Пример
Ето пример за демонстрация:
SELECT NULLIF( 5, 5 ); Резултат:
NULL
В този случай и двата аргумента са идентични и резултатът е NULL .
Когато аргументите не са еквивалентни
Ето какво се случва, когато аргументите не са еквивалентни:
SELECT NULLIF( 5, 3 ); Резултат:
5
В този случай се връща първият аргумент.
Стрингове
Ето пример, който сравнява низове:
SELECT
NULLIF( 'Papaya', 'Papaya' ) AS "Same",
NULLIF( 'Papaya', 'Salad' ) AS "Different"; Резултат:
+------+-----------+| Същото | Различни |+------+-----------+| NULL | Папая |+------+-----------+
Дати
Ето пример, който сравнява датите:
SELECT
NULLIF( DATE '2000-10-30', DATE '2000-10-30' ) AS "Same",
NULLIF( DATE '2000-10-30', DATE '1999-10-30' ) AS "Different"; Резултат:
+------+------------+| Същото | Различни |+------+------------+| NULL | 2000-10-30 |+------+-----------+
Изрази
NULLIF() оценява текущата стойност на изразите. Следователно, ако предадем израз като този:
SELECT NULLIF( 10, 2 * 5 ); Получаваме това:
NULL
2, умножено по 5, е 10, така че двата аргумента са еквивалентни.
Ето какво се случва, ако променим втория аргумент:
SELECT NULLIF( 10, 3 * 5 ); Резултат:
10
Първият аргумент се връща.
Пример за база данни
Да предположим, че изпълняваме следната заявка:
SELECT
Name,
LocalName
FROM country
ORDER BY Name ASC
LIMIT 10; Резултат:
+---------------------+-----------------------+ | Име | Локално име |+---------------------+-----------------------+| Афганистан | Афганистан/Афканестан || Албания | Шкиперия || Алжир | Ал-Джазаир/Алжир || Американска Самоа | Америка Самоа || Андора | Андора || Ангола | Ангола || Ангуила | Ангила || Антарктида | – || Антигуа и Барбуда | Антигуа и Барбуда || Аржентина | Аржентина |+---------------------+-----------------------+предварително>Тук имаме имена на държави в лявата колона, а местното име за съответната държава в дясната.
Нека добавим
NULLIF()към трета колона на нашата заявка:SELECT Name, LocalName, NULLIF(LocalName, Name) AS "Local Name Different" FROM country ORDER BY Name ASC LIMIT 10;Резултат:
+---------------------+-----------------------+ -----------------------+| Име | Локално име | Местно име различно |+---------------------+----------------------- +-----------------------+| Афганистан | Афганистан/Афканестан | Афганистан/Афканестан || Албания | Шкиперия | Шкиперия || Алжир | Ал-Джазаир/Алжир | Ал-Джазаир/Алжир || Американска Самоа | Америка Самоа | Америка Самоа || Андора | Андора | NULL || Ангола | Ангола | NULL || Ангуила | Ангуила | NULL || Антарктида | – | – || Антигуа и Барбуда | Антигуа и Барбуда | NULL || Аржентина | Аржентина | NULL |+---------------------+-----------------------+- ---------------------+Можем да видим, че третата колона връща локалното име само ако е различно от стойността в
Nameколона. Ако е същото, тогаваNULLсе връща.Като алтернатива можем да използваме
NULLIF()за филтриране на резултатите от нашите заявки:SELECT Name, LocalName FROM country WHERE NULLIF(LocalName, Name) IS NOT NULL ORDER BY Name ASC LIMIT 10;Резултат:
+----------------+-----------------------+| Име | Локално име |+----------------+--------------------------------+| Афганистан | Афганистан/Афканестан || Албания | Шкиперия || Алжир | Ал-Джазаир/Алжир || Американска Самоа | Америка Самоа || Антарктида | – || Армения | Хаджастан || Австрия | Österreich || Азербайджан | Azärbaycan || Бахамите | Бахамите || Бахрейн | Ал-Бахрейн |+----------------+--------------------------------+В този случай върнахме само онези редове, където локалното име е различно от
Nameколона.
NULLIF()срещуCASEСледният код:
NULLIF(expr1,expr2)е еквивалентен на следния
CASEизраз:CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 ENDНеправилен брой параметри
Предаването на грешен брой аргументи води до грешка:
SELECT NULLIF( 10 );Резултат:
ГРЕШКА 1582 (42000):Неправилен брой на параметрите в извикването на естествена функция „NULLIF“