我的要求是写一个函数的可选参数。参数是可选的,有时我会添加或我不会传递参数到函数。有人能帮助我如何写函数吗?
我写的是:
SELECT *
FROM test
WHERE field3 IN ('value1','value2')
AND ($1 IS null OR field1 = $1)
AND ($2 IS null OR field2 = $2)
AND ($3 IS null OR field3 = $3);
字符串
我传递参数到查询,但我的输出是不期望的。当我传递所有三个参数我的输出是正确的,否则它不是预期的输出。
4条答案
按热度按时间cuxqih211#
可以通过提供默认值来定义可选参数。
字符串
你可以从末尾“省略”参数,所以
foo()
、foo(1)
或foo(1,2)
是有效的。如果你只想提供一个不是第一个参数的参数,你必须使用指定参数名称的语法。型
返回:
p_one=, p_two=42, p_three=foo
型
返回:
p_one=1, p_two=42, p_three=foo
型
返回:
p_one=, p_two=42, p_three=bar
x6yk4ghg2#
除了@a_horse_with_no_name所指向的VARIADIC选项之外,它只是一种语法糖,用于传递具有相同类型的任意数量元素的数组**,你不能 * 定义具有可选参数的函数,因为在postgres中,函数不仅通过其名称来识别,而且还通过其参数和它们的类型来识别。
也就是说:
create function foo (int) [...]
和create function foo (varchar) [...]
将创建不同的函数。例如,
select foo(bar)
依赖于 bar 数据类型本身。也就是说:如果它是整数,则调用第一个,如果它是varchar,则调用第二个。更重要的是:如果你执行,例如,
select foo(now())
,那么一个 function not exists 异常将被触发。所以,正如我所说的,你不能用变量参数实现函数,但是你可以用相同的名字和不同的参数(一个/或类型)集实现多个函数,返回相同的数据类型。
如果你(显然)不想实现两次函数,你唯一需要做的就是实现一个带有所有可能参数的“主”函数,其他函数(参数较少)只调用“主”函数,并为未接收到的参数提供默认值。
uyhoqukh3#
作为一个选项,我得到了一个函数,我用Navicat应用程序测试:
CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"(sponsor_name varchar default 'Save the Children')
它生成我这个。(注意:请查看参数差异)CREATE OR REPLACE FUNCTION "public"."for_loop_through_query"("sponsor_name" varchar='Save the Children'::character varying)
字符串
4urapxun4#
您可以将
IN
、INOUT
和VARIADIC
参数设置为默认值,如下所示。* 带或不带IN
的参数都是IN
参数:字符串
或者:
型
然后,调用
my_func()
返回5
,如下所示:型
请注意,将默认值设置为
OUT
参数会导致以下错误:型
错误:只有输入参数可以有默认值