如果条件变为假,如何将查询结果设置为零
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
的聚合,因此每个子查询都返回一行——如果没有匹配,则其值为NULL
。 COALESCE()
将其转换为 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 。 . .我不确定你是什么意思。也许你应该问另一个问题。以上是关于如果条件变为假,如何将查询结果设置为零的主要内容,如果未能解决你的问题,请参考以下文章