SQL-返回数组的下一个值(如果不存在)的函数

时间:2019-03-28 10:14:49

标签: sql postgresql

我正在尝试使用3个参数构建函数(在PostgreSQL 9.6.11上):

  • 有序值列表(整数数组)
  • 值(整数)
  • 减去(整数)

目标:如果(value-substract)在数组中-> return(value-substract)。 如果没有,我想返回数组中的下一个可用值(下一个位置)

例如,我有这个数组[2010、2009、2008、2007、2006、1999]

如果我的值= 2008且减= 2,则我希望返回2006(数组中为2006)

如果我的值= 2008且减3 = 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);

需要帮助!

1 个答案:

答案 0 :(得分: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