如果条件变为假,如何将查询结果设置为零

Posted

技术标签:

【中文标题】如果条件变为假,如何将查询结果设置为零【英文标题】:how to set the result of query to zero if its condition becomes false 【发布时间】:2016-04-16 11:50:48 【问题描述】:

我有一个 sql 查询,它从三列返回一个表的总数,这是我的查询:

SELECT c.*,  
   (select sum(t.incoming) - sum(t.outgoing) from transactions t where t.client_id = c.id and currency = 'Dollar') +  
   (select sum(t.equal_to_dollar) from transactions t where t.incoming != 0 and currency != 'Dollar' and t.client_id = c.id) -  
   (select sum(t.equal_to_dollar) from transactions t where t.outgoing != 0 and currency != 'Dollar' and t.client_id = c.id)  
as total from clients c  

我的问题是,当第二个和第三个(内部选择)中的条件之一不满足时,它将返回空值并导致整个选择返回空值。因为空值不能与任何值相加或相减。 我想知道是否有任何方法可以将其条件评估为 false 的查询结果设置为零,这样它不会影响整个查询,并且查询将返回满足 where 子句中条件的那些部分的值。 我不知道当结果很重要并且应该如此准确时,这是一种计算价值的好方法吗? 我要提前感谢您的帮助:)

【问题讨论】:

SELECT one column if the other is null(或Return 0 if field is null in mysql)的可能重复 【参考方案1】:

你可以使用coalesce():

select c.*,  
       ((select coalesce(sum(t.incoming), 0) - coalesce(sum(t.outgoing), 0) from transactions t where t.client_id = c.id and currency = 'Dollar') +  
        (select coalesce(sum(t.equal_to_dollar), 0) from transactions t where t.incoming <> 0 and currency <> 'Dollar' and t.client_id = c.id) -  
        (select coalesce(sum(t.equal_to_dollar), 0) from transactions t where t.outgoing <> 0 and currency <> 'Dollar' and t.client_id = c.id)  
       ) as total
from clients c  ;

每个子查询都是没有group by 的聚合,因此每个子查询都返回一行——如果没有匹配,则其值为NULLCOALESCE() 将其转换为 0。

但是,三个子查询没有理由。只需使用单个子查询并使用条件聚合进行计算:

select c.*,  
       (select sum(case when currency = 'Dollar'
                        then coalesce(t.incoming, 0) - coalesce(t.outgoing, 0)
                        when t.incoming <> 0
                        then coalesce(t.equal_to_dollar, 0)
                        when t.outgoing <> 0
                        then - coalesce(t.equal_to_dollar, 0)
                        else 0
                   end)
         from transactions t
         where t.client_id = c.id
       ) as total
from clients c  ;

【讨论】:

你能告诉我如何检查你写的方法中的两个条件。你能写一个链接来了解更多关于这个方法的信息吗 @AliDK 。 . .我不确定你是什么意思。也许你应该问另一个问题。

以上是关于如果条件变为假,如何将查询结果设置为零的主要内容,如果未能解决你的问题,请参考以下文章

cublasGemmEx 结果始终为零

如果未选中单选按钮,如何将隐藏字段设置为零

基于表值的条件格式

Prometheus 来源的时间序列:如何将空值设置为零?

如何按月份或年份计数和分组,月份为零

ACCESS2003 查询条件设置 把字段里某个字改为空格或限期 记录仍显示在查询结果里