postgreSQL - 如果数组不存在,则返回数组的下一个值的函数



我正在尝试构建一个具有 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

最新更新