如何在PostgreSQL中为可选参数编写函数?

xxslljrj  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(4)|浏览(221)

我的要求是写一个函数的可选参数。参数是可选的,有时我会添加或我不会传递参数到函数。有人能帮助我如何写函数吗?
我写的是:

SELECT * 
FROM test 
WHERE field3 IN ('value1','value2') 
AND ($1 IS null OR field1 = $1) 
AND ($2 IS null OR field2 = $2) 
AND ($3 IS null OR field3 = $3);

字符串
我传递参数到查询,但我的输出是不期望的。当我传递所有三个参数我的输出是正确的,否则它不是预期的输出。

cuxqih21

cuxqih211#

可以通过提供默认值来定义可选参数。

create function foo(p_one integer default null, 
                    p_two integer default 42, 
                    p_three varchar default 'foo')
  returns text
as
$$
begin
    return format('p_one=%s, p_two=%s, p_three=%s', p_one, p_two, p_three);
end;
$$
language plpgsql;

字符串
你可以从末尾“省略”参数,所以foo()foo(1)foo(1,2)是有效的。如果你只想提供一个不是第一个参数的参数,你必须使用指定参数名称的语法。

select foo();


返回:p_one=, p_two=42, p_three=foo

select foo(1);


返回:p_one=1, p_two=42, p_three=foo

select foo(p_three => 'bar')


返回:p_one=, p_two=42, p_three=bar

x6yk4ghg

x6yk4ghg2#

除了@a_horse_with_no_name所指向的VARIADIC选项之外,它只是一种语法糖,用于传递具有相同类型的任意数量元素的数组**,你不能 * 定义具有可选参数的函数,因为在postgres中,函数不仅通过其名称来识别,而且还通过其参数和它们的类型来识别。
也就是说:create function foo (int) [...]create function foo (varchar) [...]将创建不同的函数。
例如,select foo(bar)依赖于 bar 数据类型本身。也就是说:如果它是整数,则调用第一个,如果它是varchar,则调用第二个。
更重要的是:如果你执行,例如,select foo(now()),那么一个 function not exists 异常将被触发。
所以,正如我所说的,你不能用变量参数实现函数,但是你可以用相同的名字和不同的参数(一个/或类型)集实现多个函数,返回相同的数据类型
如果你(显然)不想实现两次函数,你唯一需要做的就是实现一个带有所有可能参数的“主”函数,其他函数(参数较少)只调用“主”函数,并为未接收到的参数提供默认值。

uyhoqukh

uyhoqukh3#

作为一个选项,我得到了一个函数,我用Navicat应用程序测试:CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"(sponsor_name varchar default 'Save the Children')它生成我这个。(注意:请查看参数差异)CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"("sponsor_name" varchar='Save the Children'::character varying)

CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"("sponsor_name" varchar='Save the Children'::character varying)
  RETURNS "pg_catalog"."void" AS $BODY$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT
      companies."name" AS org_name,
      "sponsors"."name" AS sponsor_name
      FROM
      "donor_companies"
      JOIN "sponsors"
      ON "donor_companies"."donor_id" = "sponsors"."id" 
      JOIN companies
      ON "donor_companies"."organization_id" = companies."id"
      WHERE
      "public"."sponsors"."name" = sponsor_name
    LOOP
    RAISE NOTICE '%', rec.org_name;
  END LOOP;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

字符串

4urapxun

4urapxun4#

您可以将ININOUTVARIADIC参数设置为默认值,如下所示。* 带或不带IN的参数都是IN参数:

CREATE FUNCTION my_func(
  IN num1 INTEGER DEFAULT 1, 
  INOUT num2 INTEGER DEFAULT 2,
  VARIADIC nums INTEGER[] DEFAULT ARRAY[3,4]
)
AS $$
BEGIN
  SELECT num1 + num2 + nums[1] + nums[2] INTO num2;
END;
$$ LANGUAGE plpgsql;

字符串
或者:

CREATE FUNCTION my_func(
  IN INTEGER DEFAULT 1,
  INOUT INTEGER DEFAULT 2,
  VARIADIC INTEGER[] DEFAULT ARRAY[3,4]
)
AS $$
BEGIN
  SELECT $1 + $2 + $3[1] + $4[2] INTO $2;
END;
$$ LANGUAGE plpgsql;


然后,调用my_func()返回5,如下所示:

postgres=# SELECT my_func();
 my_func
---------
      10
(1 row)


请注意,将默认值设置为OUT参数会导致以下错误:

CREATE FUNCTION my_func(OUT num INTEGER DEFAULT 2)
AS $$                -- ↑↑↑             ↑ ↑ ↑ ↑ ↑
BEGIN
END;
$$ LANGUAGE plpgsql;


错误:只有输入参数可以有默认值

相关问题