Замена 0 на Null
В запросах Insert Values и Update, константа 0 или параметр со значением 0 заменяется на Null при записи в поле, если поле является ссылкой и поддерживает запись Null.
Работает только для константы 0. Значения выражений и запросов результат которых равен 0 не преобразовывается. Например 0+0 или даже (0).
Это замена не работает в хранимых процедурах.
Procedure OnCreate; Var Name : String; Group : Integer; Begin Name := 'test'; Group := 0; // При выполнении этого запроса Group будет заменено на Null (Insert Into Clients(Name, Group) Values(:Name, :Group)); // При выполнении этого запроса Group будет заменено на Null (Update Clients Set Group=:Group Where Name=:Name); // При выполнении этого запроса 0 будет заменено на Null (Update Clients Set Group=0 Where Name=:Name); // При выполнении этих запросов Group НЕ БУДЕТ заменено на Null (Update Clients Set Group=(:Group) Where Name=:Name); (Update Clients Set Group=:Group+0 Where Name=:Name); (Insert Into Clients(Name, Group) Select :Name, :Group); End;
Это сделано, что бы в программе не работать со значениями Null. К сожалению значения Null обязательны для корректной работы внешних ключей и JOIN-ов.
При извлечении значения Null из базы данных, он автоматически заменяется на 0, 0c, » или NullDatetime.
Procedure OnCreate; Var Name : String; Group : Integer; Begin Name := 'test'; // При выполнении этого запроса Null будет заменено на 0 Group := (Single Group From Clients Where Name=:Name); End;
Можно сделать замену 0 на Null и для выражений, но это снизит производительность.
Функция ISNULL (Transact-SQL)
Заменяет значение NULL указанным замещающим значением.
Синтаксис
ISNULL ( check_expression , replacement_value )
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
check_expression
Выражение, которое необходимо проверить на равенство значению NULL. Аргумент check_expression может быть любого типа.
replacement_value
Выражение, возвращаемое, если check_expression имеет значение NULL. Аргумент replacement_value должен иметь тип, который может быть неявно преобразован в тип check_expression.
Типы возвращаемых данных
Возвращает тип, совпадающий с типом выражения check_expression. Если в аргументе check_expression предоставлено литеральное значение NULL, возвращает тип данных replacement_value. Если в аргументе check_expression предоставлено литеральное значение NULL, а аргумент replacement_value не задан, возвращает int.
Замечания
Возвращается значение check_expression, если это выражение не равно NULL. В противном случае возвращается значение replacement_value. Если типы являются разными, то тип replacement_value неявно преобразуется в тип check_expression. Значение replacement_value может усекаться, если значение replacement_value длиннее, чем check_expression.
Для возврата первого значения, отличного от NULL, используйте функцию COALESCE (Transact-SQL).
Примеры
А. Использование функции ISNULL с функцией AVG
Следующий пример демонстрирует расчет среднего значения веса всех продуктов. Все записи со значением NULL в столбце 50 таблицы Weight заменяются значением Product .
USE AdventureWorks2022; GO SELECT AVG(ISNULL(Weight, 50)) FROM Production.Product; GO
-------------------------- 59.79 (1 row(s) affected)
B. Использование функции ISNULL
Следующий пример производит выборку описания, процента скидки, минимального и максимального количества для всех специальных предложений из базы AdventureWorks2022 . Если максимальное количество для отдельного специального предложения равно NULL, отображаемое значение MaxQty в результирующем наборе заменяется на 0.00 .
USE AdventureWorks2022; GO SELECT Description, DiscountPct, MinQty, ISNULL(MaxQty, 0.00) AS 'Max Quantity' FROM Sales.SpecialOffer; GO
| Description | DiscountPct | MinQty | Максимальное количество |
|---|---|---|---|
| Без скидки | 0.00 | 0 | 0 |
| Оптовая скидка | 0.02 | 11 | 14 |
| Оптовая скидка | 0.05 | 15 | 4 |
| Оптовая скидка | 0.10 | 25 | 0 |
| Оптовая скидка | 0,15 | 41 | 0 |
| Оптовая скидка | 0,20 | 61 | 0 |
| Mountain-100 Cl | 0,35 | 0 | 0 |
| Sport Helmet Di | 0.10 | 0 | 0 |
| Road-650 Overst | 0,30 | 0 | 0 |
| Mountain Tire S | 0,50 | 0 | 0 |
| Sport Helmet Di | 0,15 | 0 | 0 |
| LL Road Frame S | 0,35 | 0 | 0 |
| Touring-3000 Pr | 0,15 | 0 | 0 |
| Touring-1000 Pr | 0,20 | 0 | 0 |
| Half-Price Peda | 0,50 | 0 | 0 |
| Mountain-500 Si | 0,40 | 0 | 0 |
(16 row(s) affected)
C. Проверка значений NULL в предложении WHERE
Не используйте для поиска значений NULL выражение ISNULL, вместо него следует использовать выражение IS NULL. В следующем примере выполняется поиск всех продуктов, имеющих значение NULL в столбце веса. Заметьте, что между словами IS и NULL стоит пробел.
USE AdventureWorks2022; GO SELECT Name, Weight FROM Production.Product WHERE Weight IS NULL; GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
D. Использование функции ISNULL с функцией AVG
В приведенном ниже примере рассчитывается среднее значение веса всех продуктов в образце таблицы. Все записи со значением NULL в столбце 50 таблицы Weight заменяются значением Product .
-- Uses AdventureWorks SELECT AVG(ISNULL(Weight, 50)) FROM dbo.DimProduct;
-------------------------- 52.88
Д. Использование функции ISNULL
В приведенном ниже примере функция ISNULL используется для поиска значений NULL в столбце MinPaymentAmount и отображения значения 0.00 для соответствующих строк.
-- Uses AdventureWorks SELECT ResellerName, ISNULL(MinPaymentAmount,0) AS MinimumPayment FROM dbo.DimReseller ORDER BY ResellerName;
Здесь приводится частичный результирующий набор.
| ResellerName | MinimumPayment |
|---|---|
| A Bicycle Association | 0,0000 |
| A Bike Store | 0,0000 |
| A Cycle Shop | 0,0000 |
| A Great Bicycle Company | 0,0000 |
| A Typical Bike Shop | 200,0000 |
| Acceptable Sales & Service | 0,0000 |
F. Использование функции IS NULL для проверки на значение NULL в предложении WHERE
В приведенном ниже примере выполняется поиск всех продуктов, имеющих значение NULL в столбце Weight . Заметьте, что между словами IS и NULL стоит пробел.
-- Uses AdventureWorks SELECT EnglishProductName, Weight FROM dbo.DimProduct WHERE Weight IS NULL;
Как заменить null на 0 в sql
Чтобы заменить значение NULL на 0 в SQL, можно использовать функцию COALESCE . Эта функция принимает несколько аргументов и возвращает первый не NULL аргумент. Если все аргументы NULL , функция вернет NULL . Вот пример использования COALESCE для замены значений NULL на 0 :
SELECT COALESCE(column_name, 0) FROM table_name;
В этом запросе column_name — имя столбца, значения которого нужно заменить, а table_name — имя таблицы, в которой находится столбец. Функция COALESCE заменит все значения NULL в столбце на 0 . Если значение столбца не NULL , то функция вернет его без изменений.
Также можно использовать оператор IS NULL для проверки на NULL и замены его на 0 . Вот пример:
SELECT CASE WHEN column_name IS NULL THEN 0 ELSE column_name END FROM table_name;
Этот запрос также заменит значения NULL на 0 . Если значение столбца не NULL , то запрос вернет его без изменений.
Как заменить null на 0 в sql
Поля и переменные могут быть установлены в NULL с помощью того же синтаксиса, что и для обычных значений:
insert into MyTable values (1, 'teststring', NULL, '8-May-2004')
update MyTable set MyField = null where YourField = -1
if (Number = 0) then MyVariable = null;
— « Минуточку. но вы сказали, что MyField = NULL было недопустимо! »
Это верно. для оператора сравнения « = » (по крайней мере для СУБД Firebird до версии 2.0). Но здесь мы говорим о знаке « = », как об операторе присваивания . К сожалению, в SQL оба эти оператора имеют один и тот же символ. В случае присваивания, которое выполняется с помощью « = » или внутри списка вставки, вы можете трактовать NULL , как любое другое значение, — специальный синтаксис не требуется.
| Firebird Documentation Index → NULL в СУБД Firebird → Установка значения поля или переменной в NULL |