Как написать функцию для дополнительных параметров в postgresql?

мое требование-записать необязательные параметры в функцию.Параметры являются необязательными иногда я добавлю или не буду передавать параметры в функцию.Может кто-нибудь помочь мне, как написать функцию.

Я пишу как

select * 
from test 
where field3 in ('value1','value2') 
 and ( is null or field1 = ) 
 and ( is null or field2 = ) 
 and ( is null or field3 = );

Я передаю параметры для запроса, но мой вывод не ожидается.когда я передаю все три параметра, мой вывод правильный,иначе он не ожидается.

2 ответов


вы можете определить дополнительные параметры, указав значение по умолчанию.

create function foo(p_one integer default null, 
                    p_two integer default 42, 
                    p_three varchar default 'foo')
  returns text
as
$$
begin
    return format('p_one=%s, p_two=%s, p_three=%s', p_one, p_two, p_three);
end;
$$
language plpgsql;

вы можете "опустить" параметры с конца, так что foo(), foo(1) или foo(1,2) действительны. Если вы хотите указать только параметр, который не является первым, необходимо использовать синтаксис, указывающий имена параметров.

select foo(); 

возвращает: p_one=, p_two=42, p_three=foo

select foo(1); 

возвращает: p_one=1, p_two=42, p_three=foo

select foo(p_three => 'bar')

возвращает: p_one=, p_two=42, p_three=bar


кроме VARIADIC опция, указанная @a_horse_with_no_name, которая является только синтаксическим сахаром для передачи массива с любым количеством элементов того же типа, вы не могу определите функцию с необязательными параметрами, потому что в postgres функции идентифицируются не только по ее имени, но и по ее аргументам и типам их.

что есть: create function foo (int) [...] и create function foo (varchar) [...] создать разные функции.

который вызывается при выполнении, например,select foo(bar) зависит от бар сам тип данных. То есть: если это целое число, вы вызовете первое, а если это varchar, то будет вызван второй.

более того: если вы выполняете, например, select foo(now()), потом