带有可选参数的 Postgresql 函数
Posted
技术标签:
【中文标题】带有可选参数的 Postgresql 函数【英文标题】:Postgresql Function with optional parameters 【发布时间】:2019-11-28 14:47:56 【问题描述】:有没有办法创建一个可以用可变数量的参数调用的函数(逗号分隔,所以位置)。 例如,使用 function1(param1,param2) 调用此类函数并可能使用 function1(,param2) 或 function1(param1,) 调用它? 我创建了一个带有默认参数的函数,但调用它时出错:
select * from iDxi('3 days',) order by "Date" asc
ERROR: syntax error at or near ")"
LINE 1: select * from iDxi('3 days',) order by "Date" asc
我的函数定义是这样的:
CREATE OR REPLACE FUNCTION public.idxi(
mydated text DEFAULT '99 year'::text,
mydatef text DEFAULT '-99 year'::text)
RETURNS TABLE...
不提供参数select * from idxi()
时有效,但仅提供一个时无效...
我哪里错了?
【问题讨论】:
【参考方案1】:如果只想传第二个参数,就传名字吧:
select *
from idxi(mydatef => '-3 days');
如果你只想传递第一个参数,你可以简单地按位置传递(参数后不带,
)
select *
from idxi('3 days');
或按名称:
select *
from idxi(mydated => '3 days');
不相关,但是:
如果你想给函数传递区间,你应该声明那个类型的参数:
CREATE OR REPLACE FUNCTION public.idxi(
mydated interval DEFAULT '99 year'::interval,
mydatef interval DEFAULT '-99 year'::interval)
RETURNS TABLE...
【讨论】:
那么,位置参数没有问题吗? @Denis.A:“没问题”是什么意思? 无法使用想要的语法,即:function(,param2) 或function(param1,),更便于理解:“从大爆炸到昨天”:function(,'1 天') 或“从昨天到大危机”:function('1 day',)... 如果你想省略 param1,你不能做你想做的事。要省略可选的位置参数,您只能消除最后一个指定参数之后(右侧)的那些参数。 @a_horse_with_no_name 提供了正确答案:使用命名参数。就“便于理解”而言,恕我直言,命名参数在任何情况下都非常优越,而且是一个简单的编码练习。 明白了。谢谢大家。以上是关于带有可选参数的 Postgresql 函数的主要内容,如果未能解决你的问题,请参考以下文章