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
除了@a_horse_with_no_name指向的VARIADIC选项之外,它只是用于传递具有任意数量的相同类型元素的数组的语法糖,您无法使用可选参数定义函数,因为在postgres中,不仅识别函数通过它的名称,但也通过它的参数和它们的类型.
那就是:create function foo (int) [...]
与create function foo (varchar) [...]
将创建不同的功能.
例如,执行时调用的内容select foo(bar)
取决于条形数据类型本身.也就是说:如果它是一个整数,你将调用第一个,如果它是varchar,那么将调用第二个.
不仅如此:例如,如果执行,则会触发select foo(now())
一个不存在的函数异常.
所以,正如我所说,你不能用变量参数实现函数,但是你可以实现具有相同名称的多个函数和不同的参数(一个/或类型)集返回相同的数据类型.
如果你(显然)不希望两次实现该函数,你唯一需要做的就是实现一个带有所有可能参数的"主"函数和其他参数(参数较少)只调用"主"参数使用未接收参数的默认值.
归档时间: |
|
查看次数: |
26368 次 |
最近记录: |