説明
問題の根本は、「何もない」というあいまいな定義です。
NULL
何もない 、それが正確に何であるかは不明です。 SQLの観点から「何もない」とは、行がないことです。 :何も返されません。これは通常、行が見つからない場合に発生します。ただし、集計関数を使用する場合 、ドキュメントごと:
avg()
NULL
を返します 行が見つからない場合(つまり「何もない」場合)。 NULL
の行を取得します 結果としての値-上書き デモンストレーションするコードの初期値。
ソリューション
結果をCOALESCE
でラップします 。はるかに単純なSQL関数のデモンストレーション:
CREATE OR REPLACE FUNCTION get_height_sql(firstn varchar, lastn varchar)
RETURNS float AS
$func$
SELECT COALESCE(AVG(((p.h_feet * 12) + p.h_inches) * 2.54)::float, 0)
FROM player p
WHERE p.firstname = firstn
AND p.lastname = lastn
$func$ LANGUAGE sql STABLE;
同じことがplpgsql関数でも使用できます。この関数はSTABLE
にすることができます 、より大きなクエリのコンテキストでのパフォーマンスに役立つ可能性があります。
その他の場合
実際にできる場合 行なしを取得する クエリから、単純なCOALESCE
失敗します 、実行されないためです。
単一の値の場合 結果:クエリ全体を次のようにラップできます:
SELECT COALESCE((SELECT some_float FROM ... WHERE ... LIMIT 1), 0) AS result
PL / pgSQLには、関数から実際に戻る前にチェックする機能があります。これは、1つ以上の列を持つ複数の行で機能します 、 それも。 の例がありますマニュアル
FOUND
の使用法のデモンストレーション :
...
RETURN QUERY SELECT foo, bar ...;
IF NOT FOUND THEN
RETURN QUERY VALUES ('foo_default'::text, 'bar_default'::text);
END IF;
...
関連:
常に正確に1行を返すには 、純粋なSQLを使用することもできます :
SELECT foo, bar FROM tbl
UNION ALL
SELECT 'foo_default', 'bar_default'
LIMIT 1;
最初のSELECT
の場合 行を返さず、2番目のSELECT
デフォルトの行を返します。