【问题标题】:How to write function for optional parameters in postgresql?如何在 postgresql 中为可选参数编​​写函数?
【发布时间】:2017-02-15 05:14:46
【问题描述】:

我的要求是向函数写入可选参数。参数是可选的,有时我会添加或者我不会将参数传递给函数。谁能帮助我如何编写函数。

我写的像

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);

我正在向查询传递参数,但我的输出不是预期的。当我传递所有三个参数时,我的输出是正确的,否则它不是预期的输出。

【问题讨论】:

  • 我想在我的函数中使用和,或条件。

标签: sql postgresql plpgsql


【解决方案1】:

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

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

【讨论】:

  • 我可以在上述函数中使用 select 语句而不是返回格式吗?如果我使用 select 语句,我会收到类似“查询没有结果数据的目的地”这样的错误
  • @indu:这是一个完全不同的问题,在手册中有回答:postgresql.org/docs/current/static/…
【解决方案2】:

除了@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会被触发。

所以,正如我所说,你不能用可变参数实现函数,但你可以用相同的名称和不同的参数(一个/或类型)集合来实现多个函数,返回相同的数据类型.

如果您(显然)不想实现该函数两次,那么您唯一需要做的就是实现一个带有所有可能参数的“主”函数,而其他(参数较少)只调用“ master" 一个具有未接收参数的默认值。

【讨论】:

    【解决方案3】:

    作为一个选项,我有一个我用 Navicat App 测试过的功能: 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;
    

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2015-09-12
      • 2013-04-02
      相关资源
      最近更新 更多