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

Postgresqlが関数で実行形式を使用しようとしましたが、合体で文字列形式を指定すると列が見つかりませんというエラーが発生しました

    これはあなたが探していることをするかもしれません:

    CREATE OR REPLACE FUNCTION foo(_t text)
      RETURNS TABLE (Stage_ID bigint, Date varchar) AS
    $func$
       SELECT t.Stage_ID, t.Date
       FROM   tbl t
       WHERE  t.Date = _t::date;
    $func$  LANGUAGE sql;
    
    • where to_date(Date, "YYYY-MM-DD")==%I',_t); 複数の方法で後方にあります。

      • 値の単一引用符'YYYY-MM-DD'
      • 演算子は=です 、==ではありません 。
      • 本当に必要なようですt.Date = to_date(_t, 'YYYY-MM-DD')
      • そして_t 標準のISO形式「YYYY-MM-DD」であり、代わりにキャストするだけです:t.Date = _t::date
    • 出力列名は、関数本体内に表示されます。同じ名前のテーブル修飾列。さらに良いことに、そもそもそのような名前の競合は避けてください。参照:

    • EXECUTEを使用した動的SQLは必要ありません 。データ値を渡すことは、プレーンSQLでうまく機能します。

    • plpgsqlは必要ありません。単純なクエリには、手続き型の機能は必要ありません。 LANGUAGE sql 仕事をします-関数が必要な場合は、プレーンSQLで問題ないように見えます。

    余談ですが、「日付」などの基本的な型名を識別子として使用しないでください。正当な小文字の識別子に固執します。関連:




    1. PHPSUM関数

    2. PostgreSQLでの1日の累積合計の計算

    3. データベースに値を保存する際の問題

    4. Oracleでテーブルの列を並べ替える