現時点では、ポリモーフィック型は厳密です-他の場合、PostgreSQLは定数を最も一般的な型にキャストしようとしますが、ポリモーフィック型にはこの手順がありません-この場合、問題を説明したときに、明示的にキャストするか、ポリモーフィック型を使用しないでください。プランBは関数のオーバーロードを超えています 。
CREATE OR REPLACE FUNCTION public.icase1(cond1 boolean,
res1 integer, conddefault integer)
RETURNS integer AS $$
SELECT CASE WHEN $1 THEN $2 ELSE $3 END;
$$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION public.icase1(cond1 boolean,
res1 numeric, conddefault numeric)
RETURNS numeric AS $$
SELECT CASE WHEN $1 THEN $2 ELSE $3 END;
$$ LANGUAGE sql;
その後、コードは期待どおりに機能します:
postgres=> select icase1(true, 1.0, 0); icase1 -------- 1.0 (1 row) postgres=> select icase1(true, 1.0, 1.0); icase1 -------- 1.0 (1 row) postgres=> select icase1(true, 1, 0); icase1 -------- 1 (1 row)