Разница между ISNULL (SUM (x), 0) ИЛИ SUM (ISNULL (x, 0) в SQL-сервере
Какое из следующих утверждений верно?
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
Или они оба правильны?
Ответ 1
Оба они возвращают то же самое, за исключением случаев, когда вы выполняете запрос на пустой набор результатов.
WITH Sales(Sales) AS
(
SELECT 1
)
SELECT
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales
FROM Sales
WHERE 1=0
Возвращает
Sales Sales
----------- -----------
NULL 0
Версия SUM(ISNULL(Sales,0)) позволит избежать предупреждений ANSI об агрегировании NULL.
Еще одно небольшое отличие состоит в том, что тип данных столбца результата ISNULL(SUM(Sales),0) не считается нулевым.
Ответ 2
Попробуйте следующее:
DECLARE @table TABLE
(
id INT IDENTITY,
Alborz INT
)
INSERT INTO @table
SELECT 1
UNION ALL
SELECT 1
UNION ALL
SELECT 1
UNION ALL
SELECT 1
UNION ALL
SELECT 1
UNION ALL
SELECT NULL
SELECT ISNULL(SUM(Alborz), 0)
FROM @table
SELECT SUM(ISNULL(Alborz, 0))
FROM @table
DELETE FROM @table
SELECT ISNULL(SUM(Alborz), 0)
FROM @table
SELECT SUM(ISNULL(Alborz, 0))
FROM @table
Вы получите 21, 21, 0 и NULL. Если вы не хотите обрабатывать нули, то ISNULL (SUM (X), 0) - это путь.
Ответ 3
Первый говорит
ВСПЫТЬ каждое поле Продажи, и если поле NULL, обработайте его как ноль.
Второе говорит суммировать поле продаж, и если сумма равна NULL, сообщите об этом вместо нуля...
Однако команда SUM() пропускает NULL (хотя вы будете предупреждены об этом), поэтому первый из них приведет к тому, что вы не получите сообщение об ошибке
Ответ 4
Есть разница да. Если я не ошибаюсь
5 + NULL = NULL
поэтому первый случай
SUM(ISNULL(Sales,0)) AS Sales
изменит значение null на 0 и затем суммирует их, которые вернут 5 , а второй случай