在SQL Server查询中将NULL替换为0

时间:2013-05-30 15:47:01

标签: sql sql-server

我开发了一个查询,在前三列的结果中我得到了NULL。如何将其替换为0

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

12 个答案:

答案 0 :(得分:320)

如果您想用其他内容替换可能的null列,请使用IsNull

SELECT ISNULL(myColumn, 0 ) FROM myTable

如果它首先为空,这将在myColumn中放置一个0。

答案 1 :(得分:71)

您可以使用这两种方法,但存在差异:

SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1

比较COALESCE()和ISNULL():

  1. ISNULL函数和COALESCE表达式有类似之处 目的但行为可能不同。

  2. 因为ISNULL是一个函数,所以它只被评估一次。如 如上所述,COALESCE表达式的输入值可以是 多次评估。

  3. 结果表达式的数据类型确定是不同的。 ISNULL使用第一个参数的数据类型,COALESCE如下 CASE表达式规则并返回值的数据类型 最高优先级。

  4. 结果表达式的NULLability对于ISNULL和 合并。 ISNULL返回值始终被视为NOT NULLable (假设返回值是不可为空的)而COALESCE 具有非null参数被认为是NULL。所以 表达式ISNULL(NULL,1)和COALESCE(NULL,1)虽然 等价物具有不同的可空性值。这样做了 如果您在计算列中使用这些表达式,差异, 创建键约束或生成标量UDF的返回值 确定性的,以便它可以索引,如下所示 示例

  5. - 此语句失败,因为PRIMARY KEY无法接受NULL值 - 以及col2的COALESCE表达式的可空性 - 评估为NULL。

    CREATE TABLE #Demo 
    ( 
        col1 integer NULL, 
        col2 AS COALESCE(col1, 0) PRIMARY KEY, 
        col3 AS ISNULL(col1, 0) 
    ); 
    

    - 这个陈述成功,因为它的可空性 - ISNULL函数评估AS NOT NULL。

    CREATE TABLE #Demo 
    ( 
        col1 integer NULL, 
        col2 AS COALESCE(col1, 0), 
        col3 AS ISNULL(col1, 0) PRIMARY KEY 
    );
    
    1. ISNULL和COALESCE的验证也不同。例如, ISNULL的NULL值转换为int,而对于COALESCE, 您必须提供数据类型。

    2. ISNULL只接受2个参数,而COALESCE接受变量 参数数量。

      如果你需要从msdn。

    3. 了解更多here is the full document

答案 2 :(得分:20)

使用coalesce

coalesce(column_name,0)

虽然在汇总when condition then 1的情况下,您可以轻松地将sum更改为count - 例如:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

Count(null)返回0,而sum(null)返回null。)

答案 3 :(得分:9)

当您说出前三列时,您的意思是SUM列吗?如果是,请在ELSE 0语句中添加CASESUM值的NULLNULL

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

答案 4 :(得分:6)

在此代码中包裹您的专栏。

 ISNULL(Yourcolumn, 0)

也许检查你为什么会得到空值

答案 5 :(得分:5)

使用COALESCE,它返回第一个非空值,例如

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

如果将{Sumpceeded>返回为NULL,则将其设置为0.

答案 6 :(得分:5)

一种简单的方法是

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

答案 7 :(得分:1)

在case语句中添加else,以便在未找到测试条件时默认为零。目前,如果未找到测试条件,则将NULL传递给SUM()函数。

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

答案 8 :(得分:0)

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

这里的问题是,如果没有else语句,当运行状态不是列描述中的声明状态时,您必然会收到Null。向Null添加任何内容都将导致Null,这就是此查询的问题。

祝你好运!

答案 9 :(得分:0)

通过遵循先前的答案,我在SQL Server数据库中丢失了列名,但是遵循此语法也帮助我保留了ColumnName

ISNULL(MyColumnName, 0) MyColumnName

答案 10 :(得分:0)

如果您使用的是Presto,AWS Athena等,则没有ISNULL()函数。而是使用:

SELECT COALESCE(myColumn, 0 ) FROM myTable

答案 11 :(得分:-3)

UPDATE TableName SET ColumnName= ISNULL(ColumnName, 0 ) WHERE Id = 10