Postgresql:编写具有聚合行为的用户函数

Postgresql:编写具有聚合行为的用户函数,postgresql,null,coalesce,Postgresql,Null,Coalesce,我想写一个函数,它计算输入的非空值。我的解决办法是: CREATE FUNCTION count_not_null (VARIADIC args anyarray) RETURNS BIGINT AS $$ SELECT COUNT(x) FROM unnest(args) as x $$ LANGUAGE SQL IMMUTABLE ; 当输入至少包含一个NOTNULL值时,此函数就像一个符咒一样工作。但如果输入仅包含空值(如选择计数\u不\u空值(null,null))

我想写一个函数,它计算输入的非空值。我的解决办法是:

CREATE FUNCTION
  count_not_null (VARIADIC args anyarray) RETURNS BIGINT
  AS $$
    SELECT COUNT(x) FROM unnest(args) as x
  $$ LANGUAGE SQL IMMUTABLE
;
当输入至少包含一个NOTNULL值时,此函数就像一个符咒一样工作。但如果输入仅包含空值(如
选择计数\u不\u空值(null,null)
),则会出现错误

错误:无法确定多态类型,因为输入具有类型 “未知”


扔。但是如果我们查看
合并
,它会处理这种情况:只返回
null
。如何获得用户定义函数的一些行为?

基于Craig Ringer的评论,PostgreSQL 9.4上的以下工作:

CREATE FUNCTION
  count_not_null (VARIADIC args anyarray) RETURNS BIGINT
  AS $$
    SELECT COUNT(x) FROM unnest(args) as x
  $$ LANGUAGE SQL IMMUTABLE
;

-- Overloading with a version that expects a TEXT array
CREATE FUNCTION
  count_not_null (VARIADIC args TEXT[]) RETURNS BIGINT
  AS $$
    SELECT COUNT(x) FROM unnest(args) as x
  $$ LANGUAGE SQL IMMUTABLE
;  

您可能不想(或不能)强制转换我猜的参数
select count\u not\u null(null::bigint,null::bigint)
select count\u not\u null(null::int,null::int)
,可能吗?当然我可以强制转换参数,但我想实现
COALESCE
函数的行为。您也可以通过提供具体类型的版本来解决这个问题。我不确定这是否会导致该类型的类型解析问题,但我不这么认为。。。