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
函数的行为。您也可以通过提供具体类型的版本来解决这个问题。我不确定这是否会导致该类型的类型解析问题,但我不这么认为。。。