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
替换了复杂的or
s集合:
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(零)的主要内容,如果未能解决你的问题,请参考以下文章