2013-07-24 9 views
23

が見つからない場合リターンゼロ私は表内部いくつかの値を合計するストアドプロシージャ内部クエリ有する:この後ないレコードが

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res; 

を私は別のクエリによって取得整数でres値を減算し、返す選択結果。 WHERE句が確認された場合、すべて正常に動作します。しかし、そうでない場合、すべての関数が返すのは空の列です(空の値を持つ整数を減算しようとしている可能性があります)。

WHERE句が満たされていないと、クエリをゼロに戻す方法はありますか?

+0

'' SELECTに追加var' ... INTO 'PL/pgSQLのコードではなく、プレーンなSQLでのみ有効です。 。私はこれがPL/pgSQL関数またはDO文の一部であると仮定します。正しい? –

答えて

46

あなたができます

SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res; 

あなたのクエリは、集計関数を持っているので、これは、動作するように起こり、その結果として常には何も基本となるテーブルに見つからない場合でも、行を返します。

集計なしのプレーンクエリは、この場合、行なしを返します。 COALESCEは決して呼び出されず、あなたを救うことができませんでした。単一の列を扱っている間、私たちは、全体ではなく、クエリをラップすることができますだけでなく、あなたの元のクエリのための

SELECT COALESCE((SELECT columnA FROM my_table WHERE ID = 1), 0) 
INTO res; 

作品:COALESCE() in the manualについて

SELECT COALESCE((SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0) 
INTO res; 

詳しいです。
詳細aggregate functions in the manualについてこの後の記事で
もっと代替

+1

@FreshPrinceOfSO:私は、「COALESCE」は* SQL標準*であることに注意してください。 –

+0

私は 'COALESCE'と[bad experience](http://dba.stackexchange.com/questions/46486/function-hangs-with-null-case-operation)を持っていました...私たちは友達ではないと言ってみましょうもう – Kermit

+3

@FreshPrinceOfSO「私はSQL Serverで悪い経験をしています」、「私はCOALESCEで悪い経験をしています。他のRDBMSの 'COALESCE'には何も問題ありません。 –

1

私は、PostgreSQLに慣れていないんだけど、SQL ServerまたはOracleで、サブクエリを使用すると、Oracleの中で(下記のように動作しますSELECT 0は多分これがあまりにもPostgreSQLのために働くだろうSELECT 0 FROM DUAL

SELECT SUM(sub.value) 
FROM 
( 
    SELECT SUM(columnA) as value FROM my_table 
    WHERE columnB = 1 
    UNION 
    SELECT 0 as value 
) sub 

でしょうか?

0

また、試すことができます(私はこれを試してみました、それは私のために働いていた)

SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res; 
関連する問題