Обработка значений NULL

Завершено

Значение NULL означает, что нет значения или что значение неизвестно. Это значение не означает нулевое или пустое значение или даже пустую строку. Эти значения неизвестны. Значение NULL можно использовать для значений, которые еще не были предоставлены, например, если клиент еще не предоставил адрес электронной почты. Как было показано ранее, значение NULL может возвращаться некоторыми функциями преобразования, если значение несовместимо с целевым типом данных.

Часто для решения проблемы со значением NULL приходится предпринимать специальные действия. Значение NULL в действительности не является значением. Его значение неизвестно. Оно не равно чему-то и не равно чему угодно. Значение NULL не больше или меньше какого-либо значения. Мы не можем сказать ничего о том, что это такое, но иногда нам нужно работать со значениями NULL. К счастью, T-SQL предоставляет функции для преобразования или замены значений NULL.

ISNULL

Функция ISNULL принимает два аргумента. Первое — это проверяемое выражение. Если первый аргумент NULL, функция возвращает второй аргумент. Если первое выражение не равно NULL, оно возвращается без изменений.

Например, предположим, что таблица Sales.Customer в базе данных содержит столбец MiddleName, допускающий значения NULL. При запросе этой таблицы вместо возврата значения NULL в результате можно вернуть определенное значение, например "Отсутствует".

SELECT FirstName,
      ISNULL(MiddleName, 'None') AS MiddleIfAny,
      LastName
FROM Sales.Customer;

Результаты этого запроса могут выглядеть примерно так:

FirstName

MiddleIfAny

LastName

Orlando

N.

Ги

Кит

нет

Говард

Донна

F.

Гонсалес

...

...

...

Примечание.

Значение, подставляемое вместо NULL, должно иметь тот же тип данных, что и вычисляемое выражение. В приведенном выше примере MiddleName — это varchar, поэтому подставляемое значение не может быть числовым. Кроме того, необходимо выбрать значение, которое не будет отображаться в данных как обычное значение. Иногда может быть трудно найти значение, которое никогда не будет отображаться в данных.

В предыдущем примере было обработано значение NULL в исходной таблице, но функцию ISNULL можно использовать с любым выражением, которое может возвращать значение NULL, включая вложение функции TRY_CONVERT в функцию ISNULL.

COALESCE

Функция ISNULL не является стандартом ANSI, поэтому вместо нее может потребоваться использовать функцию COALESCE. COALESCE является немного более гибким в том, что он может принимать переменное количество аргументов, каждое из которых является выражением. Она вернет первое выражение в списке, не равное NULL.

Если имеется только два аргумента, функция COALESCE ведет себя как ISNULL. Однако при наличии более двух аргументов функция COALESCE может использоваться в качестве альтернативы многоэлементному выражению CASE с помощью функции ISNULL.

Если все аргументы имеют значение NULL, ФУНКЦИЯ COALESCE возвращает ЗНАЧЕНИЕ NULL. Все выражения должны возвращать одни и те же или совместимые типы данных.

Синтаксис выглядит следующим образом:

SELECT COALESCE ( expression1, expression2, [ ,...n ] )

В следующем примере используется вымышленная таблица с именем HR.Wages, которая содержит три столбца со сведениями о еженедельном заработке сотрудников: почасовая ставка, еженедельный оклад и комиссия от продажи. Однако служащий получает только один тип выплат. Для каждого сотрудника один из этих трех столбцов будет иметь некое значение, а остальные два будут равны NULL. Чтобы определить общую сумму, выплаченную для каждого сотрудника, можно использовать COALESCE, чтобы возвращалось только значение, отличное от NULL, содержащееся в этих трех столбцах.

SELECT EmployeeID,
      COALESCE(HourlyRate * 40,
                WeeklySalary,
                Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;

Результат должен выглядеть примерно следующим образом:

EmployeeID

WeeklyEarnings

1

899,76

2

1001,00

3

1298,77

...

...

NULLIF

Функция NULLIF позволяет возвращать значение NULL при определенных условиях. Эта функция полезна в таких областях, как очистка данных, когда требуется заменить пустые символы или заполнители значениями NULL.

Функция NULLIF принимает два аргумента и возвращает значение NULL, если аргументы равны. Если они не равны, функция NULLIF возвращает первый аргумент.

В этом примере NULLIF заменяет скидку 0 значением NULL. Она возвращает значение скидки, если оно не равно 0:

SELECT SalesOrderID,
      ProductID,
      UnitPrice,
      NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;

Результат должен выглядеть примерно следующим образом:

SalesOrderID

ProductID

UnitPrice

Discount

71774

836

356,898

NULL

71780

988

112,998

0,4

71781

748

818,7

NULL

71781

985

112,998

0,4

...

...

...

...