Функция возврата простой строки с параметром по умолчанию, переданным как NULL, возвращает NULL вместо строки - PullRequest
0 голосов
/ 25 мая 2018

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

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.

Я ожидаю, что по крайней мереreturn:

This is the string: ''

Однако, когда я называю это так:

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

Я получаю ожидаемое:

This is the string: 'usage'

Почему передача NULL в необязательный параметр делает всю строку NULL?

1 Ответ

0 голосов
/ 25 мая 2018

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

...