带有可选参数的 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

带有可选参数的 TypeScript lambda 函数

如何为带有可选参数的函数编写测试

Bash - 带有可选参数和缺少逻辑的函数

使用 PyObject_CallMethod 调用带有可选参数的函数

通过反射调用带有可选参数的方法

Javascript - 带有可选参数作为对象的函数?