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「That's 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 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 に答える
0

本番環境では、使用しないでくださいSELECT *。理由に関する完全な回答については、この SO の質問を参照してください。

COALESCEしたがって、そうでない場合は、最初の非 null 値を返す を使用できます。

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