33

テーブル内のいくつかの値を合計するストアド プロシージャ内にクエリがあります。

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

この選択の後res、別のクエリで取得した整数で値を減算し、結果を返します。WHERE句が検証された場合、すべて正常に動作します。しかし、そうでない場合、関数が返すのはすべて空の列です (おそらく、空の値で整数を減算しようとするためです)。

WHERE句が満たされていない場合、クエリがゼロを返すようにするにはどうすればよいですか?

4

4 に答える 4

62

あなたは出来る:

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;

元のクエリでも機能します。

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

詳細についてCOALESCE()は、マニュアルを参照してください。集計関数の
詳細については、マニュアルを参照してください。この後の投稿の その他の代替案:

于 2013-07-24T16:04:33.603 に答える
4

私はpostgresqlに精通していませんが、SQL ServerまたはOracleでは、サブクエリを使用すると次のように機能します(OracleSELECT 0では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

多分これはpostgresqlでもうまくいくでしょうか?

于 2013-07-24T16:12:31.900 に答える
1

あなたも試すことができます:(私はこれを試してみましたが、うまくいきました)

SELECT ISNULL((SELECT SUM(columnA) FROM my_table WHERE columnB = 1),0)) INTO res;
于 2013-10-24T12:02:03.797 に答える