4

假设我有以下 MySQL 视图:

create or replace view total_transactions(account_id, total) as
select
  t.account_id,
  ifnull(sum(t.value), 0) as total
from transactions t
where t.paid IS TRUE
group by t.bank_account_id;

假设该帐户还没有任何交易,我希望视图返回 0。现在,如果我执行如下选择:

select * from total_transactions where account_id = 2060;

并且账户 2060 没有任何交易,它不会返回任何东西,而不是 0。

我怎么能解决这个问题?

提前致谢。


编辑

我认为这可能与group by...有关

如果我在没有 group by 的情况下执行我用于视图的查询,它可以工作(即使没有结果也返回 0),但如果我使用group by它,它会为 null:

select
  t.account_id,
  ifnull(sum(t.value), 0) as total
from transactions t
where t.paid IS TRUE
and account_id = 2060;

返回0, 和

create or replace view total_transactions(account_id, total) as
select
  t.account_id,
  ifnull(sum(t.value), 0) as total
from transactions t
where t.paid IS TRUE
and account_id = 2060
group by t.bank_account_id;

返回一个空集。

4

3 回答 3

8

如果视图结果中没有条目,那么这将始终返回NULL- 那是 SQL。如果你改变你SELECT对视图使用的,你可以实现你想要的:

SELECT IFNULL(total, 0) FROM total_transactions WHERE account_id = 2060

编辑:

(SELECT IFNULL(total, 0) total FROM total_transactions WHERE account_id = 2060)
UNION
(SELECT 0 total)
于 2013-03-24T03:42:38.907 回答
0

在生产中,不要使用SELECT *. 请参阅此 SO question以获得有关原因的全面答复。

所以,假设你不是,你可以使用COALESCE,它将返回第一个非空值。

SELECT 
    COALESCE(total, 0) 
FROM
    total_transactions
WHERE
    account_id = '2600'
于 2013-03-24T03:43:06.713 回答
0

对于我使用的正值

select max(x.cnt) as cnt
from (
select ifnull(meta_value, 0) as cnt from wp_postmeta where post_id = 5543 and meta_key = '_bbp_voice_count'
union
select 0 as cnt) x

或对于任何

select x.cnt 
from (
select ifnull(meta_value, 0) as cnt from wp_postmeta where post_id = 5543 and meta_key = '_bbp_voice_count'
union
select 0 as cnt
) x
limit 1
于 2017-07-05T08:20:55.667 回答