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
函数没有帮助。不过,你的其他评论是改进;我会相应地修改我的答案。说得好<代码>可变
不适用于聚合。只是提醒读者,所提供的函数至少不能完全替换。