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

ind*_*ndu 30 sql postgresql plpgsql

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

我写得像

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);
Run Code Online (Sandbox Code Playgroud)

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

a_h*_*ame 57

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

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;
Run Code Online (Sandbox Code Playgroud)

你可以在"离开了"从最终的参数,所以foo(),foo(1)或者foo(1,2)是有效的.如果您只想提供不是第一个参数,则必须使用指定参数名称的语法.

select foo(); 
Run Code Online (Sandbox Code Playgroud)

收益: p_one=, p_two=42, p_three=foo

select foo(1); 
Run Code Online (Sandbox Code Playgroud)

收益: p_one=1, p_two=42, p_three=foo

select foo(p_three => 'bar')
Run Code Online (Sandbox Code Playgroud)

收益: p_one=, p_two=42, p_three=bar


bit*_*fet 6

除了@a_horse_with_no_name指向的VARIADIC选项之外,它只是用于传递具有任意数量的相同类型元素的数组的语法糖,您无法使用可选参数定义函数,因为在postgres中,不仅识别函数通过它的名称,但也通过它的参数和它们的类型.

那就是:create function foo (int) [...]create function foo (varchar) [...]将创建不同的功能.

例如,执行时调用的内容select foo(bar)取决于条形数据类型本身.也就是说:如果它是一个整数,你将调用第一个,如果它是varchar,那么将调用第二个.

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

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

如果你(显然)不希望两次实现该函数,你唯一需要做的就是实现一个带有所有可能参数的"主"函数和其他参数(参数较少)只调用"主"参数使用未接收参数的默认值.