使用默认参数创建Redshift UDF

时间:2018-03-20 15:51:38

标签: amazon-redshift

我正在尝试使用函数参数创建Redshift UDF,如下所示:

create or replace function function1(srctimezone VARCHAR,desttimezone VARCHAR,flag = 'nr') returns datetime

最后一个参数是一个defualt参数,即如果用户没有传递任何值,默认情况下应该采用'nr'。但是我无法使用默认参数创建函数。如果Redshfit执行/不允许使用默认参数创建函数,则提供任何建议。如果确实如此,那么相同的语法是什么?

2 个答案:

答案 0 :(得分:1)

在Redshift中,您可以使用任意数量的参数创建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

如果有一个可选参数(取决于维护同一函数的两个版本),您可以选择是否要以传递空值作为默认参数来使用单个函数,或者使用可选参数(有了更多可选参数及其变量顺序,它更复杂,第一个选项明显更好。)

答案 1 :(得分:0)

你可以这样做:

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       |
*/