在SQL服务器查询中用0replaceNULL

我开发了一个查询,并在前三列的结果我得到NULL 。 我如何用0replace它?

  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 

当你想用别的东西replace一个可能的null列时,使用IsNull 。

 SELECT ISNULL(myColumn, 0 ) FROM myTable 

这将把0放在myColumn,如果它是空的第一位。

你可以同时使用这两种方法,但有一些区别:

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

比较COALESCE()和ISNULL():

  1. ISNULL函数和COALESCEexpression式有相似的目的,但可以有不同的performance。

  2. 因为ISNULL是一个函数,所以只评估一次。 如上所述,可以多次评估COALESCEexpression式的input值。

  3. 结果expression式的数据types确定是不同的。 ISNULL使用第一个参数的数据types,COALESCE遵循CASEexpression式规则并返回优先级最高的值的数据types。

  4. 对于ISNULL和COALESCE,结果expression式的NULLability是不同的。 ISNULL返回值总是被认为不可空(假设返回值是不可空的),而具有非空参数的COALESCE被认为是NULL。 所以expression式ISNULL(NULL,1)和COALESCE(NULL,1)尽pipe等价的有不同的可空性值。 如果您在计算列中使用这些expression式,则创build关键约束或使标量UDF的返回值具有确定性,以便可以按照以下示例中所示对其进行索引。

– 这个语句失败,因为PRIMARY KEY不能接受NULL值 – col2的COALESCEexpression式的可空性 – 求值为NULL。

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

– 此语句成功,因为 – ISNULL函数的可空性评估为非空。

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

  2. ISNULL只需要2个参数,而COALESCE则需要可变数量的参数。

    如果您需要了解更多, 这里是 msdn 的完整文档 。

coalesce

 coalesce(column_name,0) 

虽然when condition then 1下总结when condition then 1 ,您可以轻松地将sum更改为count – 例如:

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

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

当你说前三列时,你的意思是你的SUM列吗? 如果是这样,请在您的CASE语句中添加ELSE 0NULL值的SUMNULL

 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, 
  • SQL小提琴演示

用这个代码包装你的专栏。

  ISNULL(Yourcolumn, 0) 

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

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

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

如果它返回为NULL将设置成功为0。

添加一个else到你的case语句,这样如果testing条件没有被发现,它们默认为零。 此刻如果没​​有发现testing条件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 

一个简单的方法是

 UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL 
 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,这是此查询的问题。

祝你好运!