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

1つのパラメータで複数の値を渡す

    VARIADIC

    @muが提供するように、VARIADIC あなたの友だちです。もう1つの重要な詳細:

    できます VARIADICを使用して関数を呼び出す 配列型のパラメータを直接。キーワードVARIADICを追加します 関数呼び出しで:

    SELECT * FROM  f_test(VARIADIC '{1, 2, 3}'::int[]);

    と同等です:

    SELECT * FROM  f_test(1, 2, 3);
    

    その他のアドバイス

    Postgres9.1以降の場合right() ネガティブ 長さは、文字列から先頭の文字をトリミングする方が速くて簡単です:

    right(j.status, -2)
    

    と同等です:

    substring(j.status, 3, char_length(jobs.status))
    

    j."DeleteFlag"があります j.DeleteFlagも同様です (二重引用符なしで)クエリで。これはおそらく正しくありません。参照:

    • PostgreSQLエラー:リレーションはすでに存在します

    "DeleteFlag" = '0' 別の問題を示します。他のRDBMSとは異なり、Postgresは booleanを適切にサポートします データ・タイプ。フラグがbooleanを保持している場合 データ(true / false / NULLbooleanを使用します タイプ。 textのような文字タイプ 不適切/非効率的です。

    適切な機能

    ここではPL/pgSQLは必要ありません。 できます より単純なSQL関数を使用します:

    CREATE OR REPLACE FUNCTION f_test(VARIADIC int[])
      RETURNS TABLE (id int, reference int, job_title text, status text)
      LANGUAGE sql AS
    $func$
       SELECT j.id, j.reference, j.job_title
            , ltrim(right(j.status, -2)) AS status
       FROM   company c
       JOIN   job     j USING (id)
       WHERE  c.active
       AND    NOT c.delete_flag
       AND    NOT j.delete_flag
       AND   (j.id = ANY($1) OR '{-1}'::int[] = $1)
       ORDER  BY j.job_title
    $func$;
    

    db<>ここでフィドル
    古いsqlfiddle



    1. phpを使用したMysqlイベントエラー

    2. SQLインデックスの概要

    3. HerokuとRails:PostgresでのGemロードエラー、ただしGEMFILEで指定

    4. SQL Server 2005で列としてランダムな数値を返すにはどうすればよいですか?