我正在尝试使用函数参数创建Redshift UDF,如下所示:
create or replace function function1(srctimezone VARCHAR,desttimezone VARCHAR,flag = 'nr') returns datetime
最后一个参数是一个defualt参数,即如果用户没有传递任何值,默认情况下应该采用'nr'。但是我无法使用默认参数创建函数。如果Redshfit执行/不允许使用默认参数创建函数,则提供任何建议。如果确实如此,那么相同的语法是什么?
答案 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 |
*/