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

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

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

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

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

cuxqih21

cuxqih211#

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

  1. create function foo(p_one integer default null,
  2. p_two integer default 42,
  3. p_three varchar default 'foo')
  4. returns text
  5. as
  6. $$
  7. begin
  8. return format('p_one=%s, p_two=%s, p_three=%s', p_one, p_two, p_three);
  9. end;
  10. $$
  11. language plpgsql;

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

  1. select foo();


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

  1. select foo(1);


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

  1. 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)

  1. CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"("sponsor_name" varchar='Save the Children'::character varying)
  2. RETURNS "pg_catalog"."void" AS $BODY$
  3. DECLARE
  4. rec RECORD;
  5. BEGIN
  6. FOR rec IN SELECT
  7. companies."name" AS org_name,
  8. "sponsors"."name" AS sponsor_name
  9. FROM
  10. "donor_companies"
  11. JOIN "sponsors"
  12. ON "donor_companies"."donor_id" = "sponsors"."id"
  13. JOIN companies
  14. ON "donor_companies"."organization_id" = companies."id"
  15. WHERE
  16. "public"."sponsors"."name" = sponsor_name
  17. LOOP
  18. RAISE NOTICE '%', rec.org_name;
  19. END LOOP;
  20. END;
  21. $BODY$
  22. LANGUAGE plpgsql VOLATILE
  23. COST 100;

字符串

展开查看全部
4urapxun

4urapxun4#

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

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

字符串
或者:

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


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

  1. postgres=# SELECT my_func();
  2. my_func
  3. ---------
  4. 10
  5. (1 row)


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

  1. CREATE FUNCTION my_func(OUT num INTEGER DEFAULT 2)
  2. AS $$ -- ↑↑↑
  3. BEGIN
  4. END;
  5. $$ LANGUAGE plpgsql;


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

展开查看全部

相关问题