Amazon redshift 使用默认参数创建红移UDF

Amazon redshift 使用默认参数创建红移UDF,amazon-redshift,Amazon Redshift,我正在尝试创建一个带有如下函数参数的红移UDF: 创建或替换函数function1(srctimezone VARCHAR,desttimezone VARCHAR,flag='nr')返回日期时间 最后一个参数将是defualt参数,即如果用户未传递任何值,则默认情况下应采用“nr”。但我无法创建带有默认参数的函数。如果Redshfit不允许使用默认参数创建函数,则提供任何建议。如果是,那么正确的语法是什么?在红移中,您可以使用任意数量的参数创建Python UDF,但在执行函数时必须传递相同

我正在尝试创建一个带有如下函数参数的红移UDF:

创建或替换函数function1(srctimezone VARCHAR,desttimezone VARCHAR,flag='nr')返回日期时间


最后一个参数将是defualt参数,即如果用户未传递任何值,则默认情况下应采用“nr”。但我无法创建带有默认参数的函数。如果Redshfit不允许使用默认参数创建函数,则提供任何建议。如果是,那么正确的语法是什么?

在红移中,您可以使用任意数量的参数创建Python UDF,但在执行函数时必须传递相同数量的参数。可选参数的解决方法是传递空值,并在函数体的开头将参数设置为默认值,如下所示:

create function f_optional_test(a int, b int)
returns int
stable as $$
    if b==None:
        return 999  # set default
    else:
        return b
$$ language plpythonu;

select f_optional_test(1,2);    -- returns 2
select f_optional_test(1,null); -- returns 999
此外,您可以创建多个名称相同但参数数量不同的函数,因此数据库引擎将根据参数数量及其数据类型选择要执行的函数:

create function f_optional_test(a int)
returns int
stable as $$
    return 999 # default for b
$$ language plpythonu;

select f_optional_test(1,2); -- returns 2
select f_optional_test(1);   -- returns 999
如果有一个可选参数,您可以选择是使用一个函数,而代价是为默认参数传递null,还是使用可选参数,而代价是维护同一函数的两个版本(有了更多的可选参数和它们的可变顺序,这就更复杂了,第一个选项显然更好)。

您可以:

CREATE OR REPLACE FUNCTION public.emulate_optional_arg(env_name varchar, optional varchar)
    RETURNS varchar
    LANGUAGE sql
    IMMUTABLE
AS $$
    
SELECT $1 || ', ' || $2

$$
;


CREATE OR REPLACE FUNCTION public.emulate_optional_arg(env_name varchar)
    RETURNS varchar
    LANGUAGE sql
    IMMUTABLE
AS $$
    
SELECT public.emulate_optional_arg($1,'default_value_here')

$$
;


SELECT public.emulate_optional_arg('dev');

/*
emulate_optional_arg   |
-----------------------|
dev, default_value_here|
 */

SELECT public.emulate_optional_arg('dev','newvalue');

/*
emulate_optional_arg|
--------------------|
dev, newvalue       |
*/