Простая функция возврата строки с параметром по умолчанию, переданным как NULL, возвращает NULL вместо строки

У меня есть следующая функция:

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 в необязательный параметр делает всю строку NULL?


person HuFlungPu    schedule 25.05.2018    source источник


Ответы (1)


Это не мистика - любая операция над значением 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 и он более агрессивен.

person Pavel Stehule    schedule 25.05.2018