即我需要一个可以像这样调用的函数
select myfunc({1,'foo', true})
或
select myfunc({42.0,7, false, x'ff'})
100%清楚我真的想要
select myfunc(array[col1,col2,col3])
其中col1,col2,col3属于不同类型。也许这会对答案产生影响
答案 0 :(得分:1)
https://www.postgresql.org/docs/current/static/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC
声明为anyelement的每个位置(参数或返回值)都允许具有任何特定的实际数据类型,但在任何给定的调用中,它们必须都是相同的实际类型。声明为anyarray的每个位置都可以具有任何数组数据类型,但类似地,它们必须都是相同的类型。
函数可以接受anyarray
,它实际上是任何相同类型的值数组,而不是在一个数组中混合的任何类型的数组...
你可能会寻找的东西是:
so=# create function ae(i anyelement) returns anyelement as $$
begin
raise info '%',i::text; return i;
end;
$$ language plpgsql
;
CREATE FUNCTION
so=# create table pm100(f float,b bool, t bytea);
CREATE TABLE
so=# select ae((42.0, false, '\xff')::pm100);
INFO: (42,f,"\\xff")
ae
----------------
(42,f,"\\xff")
(1 row)
答案 1 :(得分:1)
不,你不能这样做 - @Vao Tsun的回复是绝对正确的。 PostgreSQL SQL语言非常静态 - 比如C或Pascal。动态功能很少,但这些功能有限。
任何查询都有两个阶段 - 计划和执行。并且必须在计划时间内知道任何值的数据类型(动态查询和记录类型是例外 - 但仅在PLpgSQL中本地)。因为在执行之前必须知道所有类型,所以PostgreSQL不允许包含类型动态值的功能 - 比如多态集合。
对于常量值,可以为您的案例提供解决方法。您可以使用“any”类型的参数编写可变参数函数。它只对常量值有意义 - 类型在计划时间中是已知的,并且此函数只能在C语言中实现。例如,format
函数属于这种类型。
一些动态工作的必要性是“破碎”设计的信号。从PostgreSQL的角度看“破碎”。某些模式无法在Postgres中实现,并且更好地在外部或使用不同类型的软件实现。