Какое из следующих утверждений верно?
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
Или они оба правильны?
Какое из следующих утверждений верно?
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
Или они оба правильны?
Оба они возвращают то же самое, за исключением случаев, когда вы выполняете запрос на пустой набор результатов.
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)
не считается нулевым.
Попробуйте следующее:
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) - это путь.
Первый говорит
ВСПЫТЬ каждое поле Продажи, и если поле NULL, обработайте его как ноль.
Второе говорит суммировать поле продаж, и если сумма равна NULL, сообщите об этом вместо нуля...
Однако команда SUM() пропускает NULL (хотя вы будете предупреждены об этом), поэтому первый из них приведет к тому, что вы не получите сообщение об ошибке
Есть разница да. Если я не ошибаюсь
5 + NULL = NULL
поэтому первый случай
SUM(ISNULL(Sales,0)) AS Sales
изменит значение null на 0 и затем суммирует их, которые вернут 5
, а второй случай
ISNULL(SUM(Sales),0) AS Sales,
Вернул бы null в те же данные