1

I would like to write a function with two arguments, which would have dependency. Something like this:

    CREATE OR REPLACE FUNCTION years_compare(
        IN year1 integer DEFAULT date_part('year'::text, ('now'::text)::date),
        IN year2 integer DEFAULT year1 - 1)

...

When I call a function years_compare(2019), the second argument would have a value 2018. But how can I write a default value for the second argument?

1
  • I don't understand the question, you already have a default value for the second parameter.
    – user1822
    Commented Apr 3, 2019 at 11:45

2 Answers 2

2
CREATE OR REPLACE FUNCTION years_compare( IN year1 integer DEFAULT NULL,
                                          IN year2 integer DEFAULT NULL )

    year1 = COALESCE(year1, date_part('year'::text, ('now'::text)::date));
    year2 = COALESCE(year2, year1 - 1);
-- ...
0
1

Maybe using Postgres' support of polymorphism might be of use here.

First create the base function with both parameters.

CREATE FUNCTION years_compare(IN year1 integer,
                              IN year2 integer)
                RETURNS integer
AS
$$
BEGIN
  RETURN 1; --<replace by some calculated value>
END;
$$
LANGUAGE PLpgSQL;

Then create one function with only one parameter calling the base function with the first parameter and the calculated second parameter.

CREATE FUNCTION years_compare(IN year1 integer)
                RETURNS integer
AS
$$
BEGIN
  RETURN years_compare(year1, year1 - 1);
END;
$$
LANGUAGE PLpgSQL;

Finally create a parameterless version of the function calling the second one with a calculated parameter.

CREATE FUNCTION years_compare()
                RETURNS integer
AS
$$
BEGIN
  RETURN years_compare(date_part('year'::text, ('now'::text)::date)::integer);
END;
$$
LANGUAGE PLpgSQL;

Then you have three versions of the function with zero to two parameters.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.