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