Các kiểu đa hình rất nghiêm ngặt trong thời điểm này - trong các trường hợp khác, PostgreSQL cố gắng ép kiểu hằng số thành kiểu phổ biến nhất, nhưng bước này bị thiếu đối với các kiểu đa hình - vì vậy trong trường hợp này, khi bạn đã mô tả vấn đề, bạn phải ép kiểu rõ ràng hoặc bạn không nên sử dụng các loại đa hình. Kế hoạch B vượt quá quá tải chức năng .
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;
Sau đó, mã của bạn sẽ hoạt động như mong đợi:
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)