简单字符串返回函数,默认参数传递为NULL,返回NULL而不是字符串

时间:2018-05-25 15:03:11

标签: postgresql optional-parameters postgresql-9.6 null-string

我有以下功能:

CREATE OR REPLACE FUNCTION public.get_string(cmd_type text, udf_name text, 
group_name character varying DEFAULT 'usage'::character varying)
 RETURNS text
 LANGUAGE plpgsql
 AS $function$ 
BEGIN
 return 'This is the string: '''|| group_name ||''''::text;
END;
$function$

当我这样称呼时:

select public.get_string('test', 'myudf!', group_name=>null::character varying); 

返回NULL。

我希望它至少会回归:

This is the string: ''

然而,当我这样称呼时:

select public.get_string('test', 'myudf!');

我得到了预期的结果:

This is the string: 'usage'

为什么将NULL传递给可选参数会使整个字符串为空?

1 个答案:

答案 0 :(得分:0)

它不是神秘的 - 任何超过NULL值的操作都会再次为NULL。

postgres=# select ('Hello' || null) is null ;
┌──────────┐
│ ?column? │
╞══════════╡
│ t        │
└──────────┘
(1 row)

您应该使用coalesce函数并针对NULL值清理表达式。

postgres=# select ('Hello' || coalesce(null,'')) ;
┌──────────┐
│ ?column? │
╞══════════╡
│ Hello    │
└──────────┘
(1 row)

也许你知道一个Oracle数据库,其中NULL和空字符串相等。但它仅适用于Oracle,其他地方NULL为NULL且更具侵略性。