В MySQL понякога не искате стойностите NULL да се връщат като NULL
. Понякога искате NULL стойности да бъдат върнати с различна стойност, като например „N/A“, „Not Applicable“, „None“ или дори празния низ „“.
За щастие има няколко начина да направите това в MySQL.
Ето четири:
IFNULL()
функцияCOALESCE()
функцияIF()
функция, комбинирана сIS NULL
(илиIS NOT NULL
) операторCASE
израз, комбиниран сIS NULL
(илиIS NOT NULL
) оператор
Примери за тези опции са по-долу.
Примерни данни
Първо, нека вземем някои примерни данни:
ИЗПОЛЗВАЙТЕ решения;ИЗБЕРЕТЕ TaskCodeFrom Tasks;
Резултат:
+---------+| Код на задачата |+---------+| gar123 || NULL || NULL || куче456 || NULL || cat789 |+----------+
Така че имаме три стойности NULL и три стойности, различни от NULL.
Функцията IFNULL()
Като се има предвид името му, това е може би най-очевидната опция за подмяна на NULL стойности в MySQL. Тази функция е основно еквивалент на ISNULL()
в SQL Server.
IFNULL()
функцията ви позволява да предоставите два аргумента. Първият аргумент се връща само ако не е NULL. Ако е NULL, вместо това се връща вторият аргумент.
Ето пример за използване на IFNULL()
спрямо нашия примерен набор от данни:
ИЗБЕРЕТЕ IFNULL(TaskCode, 'N/A') КАТО Резултат ОТ Задачи;
Резултат:
<пред>+--------+| Резултат |+--------+| gar123 || N/A || N/A || куче456 || N/A || cat789 |+--------+
Тук просто заменихме NULL стойности с N/A
.
Функцията COALESCE()
Тази функция е подобна на IFNULL()
функция, но малко по-различна. Тази функция се придържа към стандарта ANSI SQL и е широко разгърната в различни RDBMS.
Начинът, по който работи, е, че предоставяте толкова аргументи, колкото са ви необходими. COALESCE()
след това ще върне първия не-NULL
стойност в списъка или NULL
ако няма не-NULL
стойности.
Като това:
ИЗБЕРЕТЕ COALESCE(TaskCode, 'N/A') КАТО Резултат ОТ Задачи;
Резултат:
<пред>+--------+| Резултат |+--------+| gar123 || N/A || N/A || куче456 || N/A || cat789 |+--------+Така получаваме точно същия резултат като преди.
Въпреки това, разликата с тази функция е, че, както споменахме, можете да предоставите списък с аргументи. COALESCE()
функцията ще приеме коя е първата стойност, различна от NULL.
Така например бихме могли да добавим NULL
като първи аргумент и поставете None
преди N/A
и вижте какво се случва:
ИЗБЕРЕТЕ СЪЕДИНЯВАНЕ(NULL, TaskCode, 'None', 'N/A') КАТО Резултат ОТ Задачи;
Резултат:
<пред>+--------+| Резултат |+--------+| gar123 || Няма || Няма || куче456 || Няма || cat789 |+--------+
Той пропусна първия NULL
както се очакваше, тогава той пропусна всички NULL стойности в TaskCode
колона, преди да се спрете на None
. N/A
стойността не се използва в този случай, защото None
е първи и е стойност, различна от NULL.
Функцията IF() в комбинация с IS NULL/IS NOT NULL
IS NULL
и IS NOT NULL
операторите ви позволяват да тествате за NULL стойности и да представяте различна стойност в зависимост от резултата.
Можем да използваме тези оператори вътре в IF()
функция, така че да се връщат стойности, различни от NULL, а стойностите NULL да се заменят със стойност по наш избор.
Пример:
ИЗБЕРЕТЕ АКО(TaskCode НЕ Е NULL, TaskCode, 'N/A') КАТО Резултат ОТ задачи;
Резултат:
<пред>+--------+| Резултат |+--------+| gar123 || N/A || N/A || куче456 || N/A || cat789 |+--------+
Така че резултатът е същият като при IFNULL()
и COALESCE()
функции.
И разбира се, бихме могли да разменим IS NOT NULL
с IS NULL
. Ако направим това, ще трябва да сменим и следващите аргументи:
ИЗБЕРЕТЕ IF(TaskCode IS NULL, 'N/A', TaskCode) КАТО Резултат ОТ задачи;
Изразът CASE, комбиниран с IS NULL/IS NOT NULL
Друг начин да го направите е да използвате CASE
израз:
ИЗБЕРЕТЕ СЛУЧАЙ, КОГАТО TaskCode НЕ Е NULL, ТОГАВА TaskCode ELSE 'N/A' END AS ResultFROM Tasks;
Резултат:
<пред>+--------+| Резултат |+--------+| gar123 || N/A || N/A || куче456 || N/A || cat789 |+--------+
Както в предишния пример, това може да бъде пренаписано, за да се използва IS NULL
вместо IS NOT NULL
:
ИЗБЕРЕТЕ СЛУЧАЙ, КОГАТО TaskCode е NULL, ТОГАВА 'N/A' ИНАЧЕ TaskCode END AS ResultFROM Tasks;