どの次のいずれが正しいか?差(SUM(x)が、0)OR SUM(ISNULL(X、0)SQLサーバで
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
それともどちらが正しい?
どの次のいずれが正しいか?差(SUM(x)が、0)OR SUM(ISNULL(X、0)SQLサーバで
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))
バージョンでは、NULL
の集約に関するANSI警告は回避されます。
もう1つの微妙な違いの1つは、結果列のデータ型がISNULL(SUM(Sales),0)
であるとみなされ、nullableとはみなされません。
最初のものは、すべての売上フィールド
SUMまで言うと、フィールドがNULLである場合、ゼロとして扱います。
秒が合計アップ売上フィールドを言うと、合計がNULLであれば、代わりにゼロを報告(あなたはそれについて警告されるでしょうが)...
はしかし、SUM()コマンドは、NULLをスキップ、最初の1が原因となりますので、エラーメッセージ
はこれを試してみてください取得しない:
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を取得します。 NULLを処理したくない場合は、ISNULL(SUM(X)、0)を使用します。
違いがあります。私は間違っていないよ場合
5 + NULL = NULL
ので最初のケース
SUM(ISNULL(Sales,0)) AS Sales
は0にnull値を変更しますした後、第2ケース
ISNULL(SUM(Sales),0) AS Sales,
ながら5
を返すことになるそれらを合計します同じデータにnullが返される
nice @martinsmith –
単語Sの過度の使用エールですか? Sales_CTE WITH (SalesAndNulls) AS( はSELECT 1 UNION SELECT NULL ) SUM(ISNULL(SalesAndNulls、0))SALES1 AS、 ISNULL SELECT (SUM(SalesAndNulls)を、0)SALES2 AS Sales_CTE FROM この結果は警告付きです。 Sales1 = 1 Sales2 = 1 警告:Null値は、集計または他のSET操作によって削除されます。 (1行が該当) – Alborz
@Alborz - はい、それは 'Sales2'バージョンのANSI警告です。空の結果セットに '0'を返し、警告が表示されないようにするには、' ISNULL(SUM(ISNULL(SalesAndNulls、0))、0)AS Sales3'を実行します。 –