sql - 在自定义聚合函数 postgresql 中查找最小值或最大值
问题描述
我是 Postgresql 的新手(我在 PL/pgSQL 中编程,与 sql 没有太大区别)。我写了我的客户聚合函数,它必须在一个数字数组中找到最小值或最大值。 这是函数聚合代码
CREATE OR REPLACE FUNCTION searchMaxValue (numeric[]) RETURNS numeric AS $$
DECLARE
i numeric;
maxVal numeric;
BEGIN
maxVal = $1[1];
IF ARRAY_LENGHT($1,1) > 0 THEN --Checking whether the array is empty or not
<<confrontoMassimo>>
FOREACH i IN ARRAY $1 LOOP --Looping through the entire array, passed as parameter
IF maxVal <= $1[i] THEN
maxVal := $1[i];
END IF;
END LOOP confrontoMassimo;
ELSE
RAISE NOTICE 'Invalid parameter % passed to the aggregate function',$1;
--Raising exception if the parameter passed as argument points to null.
RAISE EXCEPTION 'Cannot find Max value. Parameter % is null', $1
USING HINT = 'You cannot pass a null array! Check the passed parameter';
END IF;
RETURN maxVal;
END;
$$ LANGUAGE plpgsql;
CREATE AGGREGATE searchMaxValueArray (numeric)
(
sfunc = array_append,
stype = numeric[],
finalfunc = searchMaxValue,
initCond = '{}'
);
问题是,它没有按预期工作。问题是什么?
解决方案
如上所述,您的函数中有一个小错字;ARRAY_LENGHT
应该是ARRAY_LENGTH
。
除此之外,我能看到的唯一问题是:
FOREACH i IN ARRAY $1 LOOP
IF maxVal <= $1[i] THEN
...
在FOREACH
循环中,目标变量i
不是数组索引,而是数组元素本身。换句话说,循环应该是:
FOREACH i IN ARRAY $1 LOOP
IF maxVal <= i THEN
maxVal := i;
END IF;
END LOOP
通过这些更改,它似乎按预期工作:https ://rextester.com/FTWB14034
推荐阅读
- java - 正则表达式用Java中的其他文件路径替换字符串中的文件路径
- c# - 无法处理文件 resx,因为它位于 Internet 或受限区域或文件上有 Web 标记
- javascript - 改变html元素背景图片js
- c# - 在发布模式下构建以 xamarin.forms 编码的 UWP 应用会导致内部编译器错误:指定的转换无效
- android - Google Fit Api Android 按小时计算每日步数和总锻炼时间
- sql-server - 发现天数月差
- javascript - 从 main.js 访问存储
- julia - 参考不带点符号的结构字段(在 Julia 中)
- java - ElasticSearch - RestHighLevelClient java.io.IOException:现有连接被远程主机强行关闭
- arrays - 将猫鼬结果转换为数组组