Postgresql 创建聚合时出现语法错误

Postgresql 创建聚合时出现语法错误,postgresql,aggregate,aggregate-functions,postgresql-9.5,Postgresql,Aggregate,Aggregate Functions,Postgresql 9.5,正在尝试创建聚合函数: create aggregate min (my_type) ( sfunc = least, stype = my_type ); ERROR: syntax error at or near "least" LINE 2: sfunc = least, ^ 我错过了什么 : 最大值和最小值函数从任意数量的表达式列表中选择最大值或最小值 我找不到: \dfS least

正在尝试创建聚合函数:

create aggregate min (my_type) (
    sfunc = least,
    stype = my_type
);
ERROR:  syntax error at or near "least"
LINE 2:     sfunc = least,
                    ^
我错过了什么

:

最大值和最小值函数从任意数量的表达式列表中选择最大值或最小值

我找不到:

\dfS least
                       List of functions
 Schema | Name | Result data type | Argument data types | Type 
--------+------+------------------+---------------------+------
(0 rows)

最小
最大
不是真正的函数;在内部,它们被解析为
MinMaxExpr
(请参见
src/include/nodes/primnodes.h

您可以使用以下通用函数实现所需的功能:

CREATE FUNCTION my_least(anyelement, anyelement) RETURNS anyelement
   LANGUAGE sql IMMUTABLE CALLED ON NULL INPUT
   AS 'SELECT LEAST($1, $2)';
(感谢Erwin Brandstetter调用空输入的
,以及使用
最小值的想法)

然后,您可以将聚合创建为

CREATE AGGREGATE min(my_type) (sfunc = my_least, stype = my_type);

这只在
my_type
有比较函数的情况下才有效,否则您必须提出一个不同的
my_least
函数。

CASE
COALESCE
NULLIF
最大的
最小的
在本章中列出。这些SQL构造不是作为函数实现的。。就像在这段时间

手册建议:

提示:如果您的需求超出了这些系统的功能范围 表达式中,您可能需要考虑写入存储过程 一种更具表现力的编程语言

这里的术语也有点离题,因为Postgres不支持真正的“存储过程”,只支持函数。(这就是为什么会出现这种情况。)

此手册页可能会被锐化以避免混淆

@劳伦斯也提供了一个例子。我只想在函数中使用
LEAST
,以获得相同的功能:

CREATE FUNCTION f_least(anyelement, anyelement)
  RETURNS anyelement LANGUAGE sql IMMUTABLE AS
'SELECT LEAST($1, $2)';
不要让它变得严格
,那是不正确的
LEAST(1,NULL)
返回
1
而不是
NULL

即使
STRICT
是正确的,我也不会使用它,因为它可以防止函数内联


请注意,此函数仅限于两个参数,而
LEAST
接受任意数量的参数。您可能会重载该函数以覆盖3、4等输入参数。或者您可以为最多100个参数编写一个
VARIADIC
函数。

FWIW,相关邮件列表帖子:要定义聚合,您需要一个带有两个参数的函数,因此
VARIADIC
函数没有帮助。不过,你的其他评论是改进;我会相应地修改我的答案。说得好<代码>可变
不适用于聚合。只是提醒读者,所提供的函数至少不能完全替换