2017-05-25 54 views
0

我正在创建一个报告生成器,它允许我通过选择保存在数据库中的表和字段来构建自定义报告。每个表,字段,计算值等被视为一个单独的实体,不与任何其他实体直接连接。他们都是独立的。如何使用IF搜索条件作为“真”值

我有一计次字段/列,这是我目前有工作的,使用类似于下面的代码:

sum(case when usasf_teams.division_levelid=7 then 1 else 0 end) as Dance 

我的问题是,有相当多的这些列中,大部分值是零。这使得很难发现非零值,这是我们想看到的。

我知道我可以使用IF语句来返回数字或空格,但我不想让服务器通过为每行中的每列执行相同操作两次的工作。我愿做这样的事情:

if(sum(case when usasf_teams.division_levelid=7 then 1 else 0 end), 
    {{use the comparison value}}, ' ') as Dance 

这样,总和/箱操作只为每个字段做一次。

这可能吗?

+1

你的问题不清楚。通常情况下,如果你想限制一个聚合,你可以通过一个限制行数的WHERE子句来实现。请在此发布示例数据以获得更好的结果。 –

+0

我不是想限制行数。正如我上面明确指出的,我试图从_columns_中删除零。字段“division_levelid”总是非零并且是从1到9(或更多,某天)的数字。 –

回答

1

首先,可以简化您的逻辑:

sum(usasf_teams.division_levelid = 7) as Dance 

然后,我将建议改变0NULL,而不是空间:

nullif(sum(usasf_teams.division_levelid = 7), 0) as Dance 

如果你要返回真实的空间,你需要小心类型。你可以这样做;

select (case when sum(usasf_teams.division_levelid = 7) > 0 
      then cast(sum(usasf_teams.division_levelid = 7) as char) 
      else ' ' 
     end) 

您不需要担心两次执行sum()。聚合中的费用是操纵数据,而不是(通常)计算聚合函数本身。

+0

我以为它是IFNULL而不是NULLIF – hiule

+0

@hiule。 。 。这些函数是不一样的:https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_ifnull。只要忘记'IFNULL()'。使用'COALESCE()'。 –

+0

这很好,谢谢。我想我可能需要这个空间,但显然我没有。 因此,如果参数A匹配参数B(我认为它可能不是零),那么NULLIF将返回NULL,否则返回参数A?我相信我可以找到其他用途。 –

相关问题