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

PostgreSQLのパラメータ化されたOrderBy/ Limit in table function

    plpgsql関数には何の問題もありません もう少し複雑なもののために。パフォーマンスが低下する可能性がある唯一の状況は、plpgsql関数がネストされている場合です。これは、クエリプランナーが、外部クエリのコンテキストで含まれているコードをさらに最適化できず、速度が低下する場合と低下しない場合があるためです。
    詳細については、後で説明します。回答:

    • PostgreSQL関数の言語sqlと言語plpgsqlの違い

    手元にある場合は、多くのCASEよりもはるかに簡単です。 クエリの句:

    CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
      RETURNS SETOF stuff AS
    $func$
    BEGIN
       RETURN QUERY EXECUTE '
          SELECT *
          FROM   stuff
          WHERE  col = $1
          ORDER  BY ' || quote_ident(_orderby) || ' ASC
          LIMIT  $2'
       USING _param, _limit;
    END
    $func$  LANGUAGE plpgsql;
    

    電話:

    SELECT * FROM get_stuff('hello', 'col2', 100);
    

    メモ

    RETURN QUERY EXECUTEを使用します クエリの結果を一度に返します。

    quote_ident()を使用します SQLiから保護するための識別子。
    またはformat() もっと複雑なもののために。参照:

    • PostgreSQL関数パラメータとしてのテーブル名

    USINGを使用してパラメータ値を渡します キャスト、引用、SQLiをもう一度避けるための句。

    パラメータと列名の間に名前の競合が発生しないように注意してください。パラメータ名の前にアンダースコア(_)を付けました )例では。私の個人的な好みです。

    parentのみを返すため、編集後の2番目の関数は機能しません。 戻りタイプがSETOF stuffと宣言されている間 。 任意を宣言できます 好きなタイプを返しますが、実際の戻り値は宣言と一致する必要があります。 RETURNS TABLEを使用することをお勧めします そのために。



    1. 関数に値の複数のセットまたは配列を渡します

    2. 中間テーブルを使用してpostgresテーブルを分割する方法

    3. date_part()がPostgreSQLでどのように機能するか

    4. 返されたUriからデータベースに挿入された新しいレコードのIDを取得します