web-dev-qa-db-ja.com

レコードが見つからない場合はゼロを返します

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

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

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

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

30
giozh

あなたは出来る:

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

クエリには集計関数があり、その結果、基になるテーブルに何も見つからない場合でも、常にalwaysが行を返すため、これは機能します。

このような場合、集約なしの単純なクエリはno rowを返します。 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()の詳細
詳細については、 マニュアルの集約関数
その他の代替案

57

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

3
Jim

あなたも試すことができます:(私はこれを試しましたが、それは私のために働きました)

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