【问题标题】:Postgresql Function with optional parameters带有可选参数的 Postgresql 函数
【发布时间】: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() 时有效,但仅提供一个时无效...

我哪里错了?

【问题讨论】:

    标签: postgresql parameters stored-functions


    【解决方案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 提供了正确答案:使用命名参数。就“便于理解”而言,恕我直言,命名参数在任何情况下都非常优越,而且是一个简单的编码练习。
    • 明白了。谢谢大家。
    猜你喜欢
    • 2011-04-28
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多