sql >> データベース >  >> RDS >> PostgreSQL

値が見つからない場合に関数から値を返す方法

    説明

    問題の根本は、「何もない」というあいまいな定義です。

    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;
    

    SQLフィドル。

    同じことが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 デフォルトの行を返します。



    1. プリペアドステートメントでレコードを更新し、更新が機能したかどうかを確認します

    2. Oracleで連結文字列を生成する高速な方法

    3. MySQLビュー-使用する場合と使用しない場合

    4. Oracle 11g(クライアント)をアンインストール/完全に削除する方法は?