SQL服务器中ISNULL(SUM(x),0)或SUM(ISNULL(x,0)之间的差异

Alb*_*orz 19 sql-server sql-server-2008

以下哪一项是正确的?

        SUM(ISNULL(Sales,0)) AS Sales,
        ISNULL(SUM(Sales),0) AS Sales,
Run Code Online (Sandbox Code Playgroud)

或者他们都是正确的?

Mar*_*ith 18

除非您在空结果集上运行查询,否则它们都返回相同的值.

WITH Sales(Sales) AS
(
SELECT 1
)
SELECT
        SUM(ISNULL(Sales,0)) AS Sales,
        ISNULL(SUM(Sales),0) AS Sales
FROM     Sales    
WHERE 1=0
Run Code Online (Sandbox Code Playgroud)

返回

Sales       Sales
----------- -----------
NULL        0
Run Code Online (Sandbox Code Playgroud)

SUM(ISNULL(Sales,0))版本将避免有关聚合的ANSI警告NULL.

另一个细微差别是结果列的数据类型ISNULL(SUM(Sales),0)不被视为可为空.


Spa*_*rky 5

第一个说

对每个 Sales 字段求和,如果该字段为 NULL,则将其视为零。

第二个表示对销售字段求和,如果总计为 NULL,则报告零...

但是,SUM() 命令会跳过 NULL(尽管您会收到警告),因此第一个命令将导致您看不到错误消息


SQL*_*son 5

尝试这个:

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
Run Code Online (Sandbox Code Playgroud)

您将得到 21、21、0 和 NULL。如果您不想处理空值,则可以使用 ISNULL(SUM(X),0) 。