我正在尝试构建一个具有 3 个参数的函数(在 PostgreSQL 9.6.11 上(:
- 有序值列表(整数数组(
- 值(整数(
- 减法(整数(
目的:如果(值 - 减去(在数组中 -> 返回(值 - 减去(。如果没有,我想返回数组中可用的下一个值(下一个位置(
例如,我有这个数组 [2010, 2009, 2008, 2007, 2006, 1999]
如果我的值 = 2008 并且减去 = 2,我希望返回 2006(2006 在数组中(
如果我的值 = 2008 并且减去 = 3,我希望返回 1999(2005 不在数组中,下一个可用的值是 1999(
现在,我在这里:
CREATE OR REPLACE FUNCTION _fonctions_globales.check_year_exist(liste INT[], value integer, substract integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
BEGIN
IF EXISTS (SELECT 1 WHERE (value - substract) = ANY(liste)) THEN
return value - substract;
ELSE
return ?;
END IF;
END; $function$
SELECT _fonctions_globales.check_year_exist(array[2010, 2009, 2008, 2007, 2006, 1999], 2008, 3);
谢谢你的帮助!
你可以用SQL函数来做到这一点,不需要PL/pgSQL:
CREATE OR REPLACE FUNCTION check_year_exist(liste INT[], value integer, substract integer)
RETURNS integer
AS
$function$
select max(v)
from unnest(liste) as t(v)
where t.v <= value - substract;
$function$
LANGUAGE sql;
unnest 将所有值作为行返回,where
子句将其限制为小于 value - substract
结果的值,然后返回最大数字。如果这与将返回的value - substract
相同,否则为下一个最高值。
SELECT check_year_exist(array[2010, 2009, 2008, 2007, 2006, 1999], 2008, 3);
返回1999
SELECT check_year_exist(array[2010, 2009, 2008, 2007, 2006, 1999], 2008, 2);
返回2006