SOQL:避免使用 NULL 结果计数,而是返回 0(零)

Posted

技术标签:

【中文标题】SOQL:避免使用 NULL 结果计数,而是返回 0(零)【英文标题】:SOQL: Avoid count with NULL results return 0 (zero) instead 【发布时间】:2014-03-28 12:17:21 【问题描述】:

我有一个问题,我写了一个查询,我需要按给定的顺序返回机会计数:Name1、Name2、Name3、Name4。问题是,如果计数为 NULL,例如 Name2,则查询返回 Name1_count、Name3_count、Name4_count。

我需要确保始终以正确的顺序获取值,如果值为 null,我需要返回 0。但它不起作用:(

我试过了:

Select Owner.Name
      ,IF(ISBLANK(count(id))
      ,0
      ,count(id)) 

  from Opportunity 

  where CloseDate = Today 
    and Approved__c = true 
    and (Owner.Name = 'Name1' 
         or Owner.Name = 'Name2' 
         or Owner.Name = 'Name3' 
         or Owner.Name = 'Name4') 

  group by Owner.Name 

【问题讨论】:

什么不起作用? 嘿,不幸的是,我每天早上都会收到一个空的回复(当没有机会关闭时),如果员工是例如在假期(例如name2)订单结果是错误的,因为name2不会出现在结果中。 我想得到 name1: 0 name2: 0 name3: 0 name4: 0 所以与其不显示空结果的任何结果,不如用 0 列出结果 【参考方案1】:

您的查询使用名为owner 的表别名,该别名未定义。据推测,这应该是指Opportunity,尽管这只是一个猜测。另外,当你有一个NULL 时,要得到一个0,典型的函数是coalesce()。我用in替换了复杂的ors集合:

Select o.Name, coalesce(count(id), 0) 
from Opportunity o
where CloseDate = Today and Approved__c = true and
      o.Name in ('Name1', 'Name2', 'Name3', 'Name4')
group by o.Name ;

最后,要在输出中获取所有四个名称,您需要使用left outer join

Select names.Name, count(o.id) as cnt
from (select 'Name1' as name union all select 'Name2' union all
      select 'Name3' union all select 'Name4'
     ) names left outer join
     Opportunity o
     on names.name = o.name
where CloseDate = Today and Approved__c = true
group by names.Name ;

【讨论】:

您好,感谢您的快速回答!不幸的是,我现在无法让它工作。供我理解的问题:我是否还需要在第二个查询中使用 coalesce() 以确保如果为 null 我得到 0 结果? @user3472527 。 . .不会。在这种情况下,count(<column>) 将在第二个表中没有匹配的行时返回 0 hmm 我收到语法错误。我对 SOQL(不是 SQL)很陌生,恕我直言 SOQL 不支持 OUTER JOIN 甚至 UNION ALL 语句? mysql 确实如此。我不知道 SOQL。是否支持子查询? 是的,我知道在 mysql 中这会起作用,但在这里我们会有多个选项,例如 isnull() 等。所有这些在 SOQL 中都不存在...无论如何感谢您的帮助

以上是关于SOQL:避免使用 NULL 结果计数,而是返回 0(零)的主要内容,如果未能解决你的问题,请参考以下文章

014_SOQL 和 SOSL

带 Pivot 的存储过程不返回结果结构,而是返回零值

带有枢轴的存储过程不会返回结果结构而是返回零值

(ASP.NET) SQL 数据读取器返回 Null 值

count的一些用法

在 getSingleResult 聚合中处理 null 的正确方法