1

SQL Server 関数と同等の Postgres 関数が必要ですconvert。私は関数を書くことになった

    CREATE OR REPLACE FUNCTION convert (target VARCHAR(50),source ANYELEMENT,style INT) RETURNS ANYELEMENT
    AS
    $$ BEGIN
    CASE
   when style=0 then CASE
   WHEN target ='int' THEN return source::int;
   WHEN target ='smallint' or target = 'tinyint' THEN return source::smallint;
   WHEN target ='bigint' THEN return source::bigint;
   WHEN target ='numeric' or target = 'real' or target = 'float' THEN return source::double precision;
   WHEN target ='smallmoney' or target = 'money' or target = 'decimal' THEN return source::double precision;
   WHEN target ='char' THEN return source::char;
   WHEN target ='datetime' or target = 'smalldatetime' then return source::timestamp;
   WHEN target like 'varchar%' or target like 'nvarchar%' THEN return source::varchar;
   WHEN target = 'text' or target like 'ntext' THEN return source::text;
   WHEN target = 'timestamp' THEN return source::varchar(30);
   WHEN target = 'binary' or target='varbinary' THEN return source::bytea;
   WHEN target = 'uniqueidentifier' THEN return source::varchar(37);
   WHEN target = 'sysname' THEN return source::varchar(128);
   WHEN target = 'sql_variant' THEN return varchar;
   WHEN target = 'bit' THEN if source::varchar='1' THEN return true; ELSIF source::varchar='0' THEN return false; else RAISE EXCEPTION 'Invalid value for Input boolean'; END IF;
   ELSE return source::anyelement;
END CASE;
   when style!=0 then CASE
   WHEN (style = 0 OR style = 100) THEN return to_timestamp(source::text,'mon dd yyyy hh:miAM');
       WHEN style = 1 THEN return to_timestamp(source::text,'mm/dd/yy');
       WHEN style = 101 THEN return to_timestamp(source::text,'mm/dd/yyyy');
       ..
   ..
END CASE;
 END CASE;
  END;
$$ LANGUAGE plpgsql;

関数を as として呼び出すとselect convert('int','1',0)、次のエラーがスローされます。

「エラー: 入力の型が「不明」であるため、ポリモーフィック型を判別できませんでした。1 つのステートメントが失敗しました。」

2 番目のパラメーターを convert('int','1'::text,0) として明示的にキャストすると、機能します。しかし、追加のキャストを行わずに呼び出す必要があります。誰か助けてくれませんか?

4

1 に答える 1

0

convertPostgreSQL パーサーを変更しないと関数 like を書くことはできません。cast代わりにPostgreSQL関数を使用してください。anyelementはテンプレートのようなものですanyelement。入力がintの場合anyelement、出力もint同様です。これはあなたが望むものではありません。

PostgreSQL は、結果の型が関数内で選択される場合、関数を書くことを許可しません。関数を呼び出す前に、結果の型を知っておく必要があります。また、PostgreSQL は関数について何も認識していないため、必要な結果タイプを選択できません。

于 2017-04-12T03:52:56.770 に答える