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

新手上路,请多包涵

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

我写得像

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

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

原文由 indu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

 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

原文由 a_horse_with_no_name 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了@a_horse_with_no_name 指向的 VARIADIC 选项,它只是传递具有任意数量 的相同类型 元素的数组的语法糖,你 不能 定义带有可选参数的函数,因为在 postgres 中,函数不仅被识别通过它的名字,也通过它的论点和它们的类型。

即: create function foo (int) [...]create function foo (varchar) [...] 会创建 不同的 功能。

执行时调用哪个,例如 select foo(bar) 取决于 数据类型本身。即:如果是整数,则调用第一个,如果是 varchar,则调用第二个。

不仅如此:如果您执行例如 select foo(now()) ,则会触发 函数不存在 异常。

因此,正如我所说,您不能实现具有可变参数的函数, 但您可以实现多个具有相同名称和不同参数(一个/或类型)集返回相同数据类型的函数

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

原文由 bitifet 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进