如何使用混合int和数值参数在一个Postgres 9.1+功能(How to use mixed

2019-10-23 03:32发布

我正在寻找一种方式来创建一个icase()与任何第二个和第三个参数兼容的数据类型的工作功能。
我试着在Postgres的9.4:

CREATE OR REPLACE FUNCTION public.icase(
    cond1 boolean,
    res1 anyelement,
    conddefault anyelement)
  RETURNS anyelement AS
' SELECT CASE WHEN $1 THEN $2 ELSE $3 END; '
  LANGUAGE sql IMMUTABLE;

但:

select icase( true, 1.0, 0 )

导致错误:

 ERROR: function icase(boolean, numeric, integer) does not exist LINE 9: select icase( true, 1.0, 0 ) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

如何解决这个问题的9.1+,使第二和第三个参数可以是int或数字?

如果两个第二和第三参数是这个方法可以被称为textchar(n)datenumericint类型。

Answer 1:

多态的类型在这个时刻严格 - 在其他情况下,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)


文章来源: How to use mixed int and numeric arguments in a Postgres 9.1+ function