PostgreSQL调⽤函数
允许函数有命名参数,可以被位置或名称表⽰法调⽤。名称表⽰法对有⼤量参数的函数特别有⽤,因为它更加明确和可靠的标记了形参和实参之间的联系。在位置表⽰法⾥,⼀个函数调⽤的参数值要⽤与函数声明相同的顺序来写出。在名称表⽰法⾥,参数是通过名称来与函数参数相匹配的,可以以任意顺序写出。
不管⽤那种表⽰法,在函数声明时给出的有默认值的参数在调⽤时不必写出。但是这在名称表⽰法中是特别有⽤的,因为参数的任意组合都是可以省略的。⽽在位置表⽰法中,参数只能从右到左省略。
PostgreSQL也⽀持混合表⽰法,混合表⽰法结合了位置和名称表⽰法。因为这个原因,先写位置参数然后跟着写命名参数。
下⾯的例⼦将说明三种表⽰法的⽤法,使⽤下⾯的函数定义:
CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
SELECT CASE
WHEN $3 THEN UPPER($1 || ' ' || $2)
ELSE LOWER($1 || ' ' || $2)
END;
$$
LANGUAGE SQL IMMUTABLE STRICT;
函数concat_lower_or_upper有两个强制的参数,a和b。此外第三个参数是⼀个可选参数uppercase,默认为false。a和b输⼊将被串联,并且将根
据uppercase参数强制为⼤写或者⼩写。
1. 使⽤位置表⽰法
在PostgreSQL中,位置表⽰法是传递参数到函数的传统机制。⼀个例⼦是:
SELECT concat_lower_or_upper('Hello', 'World', true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
postgre trunc函数的使用方法所有的参数都按顺序指定。因为uppercase被指定为true,所以结果为⼤写。另外⼀个例⼦是:
SELECT concat_lower_or_upper('Hello', 'World');
concat_lower_or_upper
-----------------------
hello world
(1 row)
这⾥,省略了参数uppercase,所以接受它的默认值false,导致⼩写的输出。在位置表⽰法中,参数只要有默认值就可以从右到左省略。2. 使⽤名称表⽰法
在名称表⽰法中,每个参数名字是使⽤:=声明的,⽤来将它从参数表达式中独⽴出来。例如:
SELECT concat_lower_or_upper(a := 'Hello', b := 'World');
concat_lower_or_upper
-----------------------
hello world
(1 row)
另外,参数uppercase是省略的,所以它被隐式的设置为false。使⽤名称表⽰法的好处之⼀是参数可以⽤任意顺序声明,例如:
SELECT concat_lower_or_upper(a := 'Hello', b := 'World', uppercase := true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
3. 使⽤混合表⽰法
混合表⽰法结合了位置和名称表⽰法。然⽽,就像之前提到的,命名参数不可以在位置参数前⾯。例如:
SELECT concat_lower_or_upper('Hello', 'World', uppercase := true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
在上⾯的查询中,参数a和uppercase是⽤位置声明的,⽽uppercase是⽤名称声明的。在这个例⼦中,添加了⽂档中没有的⼀点。在⼀个有多个参数有默认值的更复杂的函数中,名称或者混合表⽰法可以节省很多敲键,并且可以减少犯错的⼏率。
注意: 在调⽤⼀个聚合函数时,⽬前不能使⽤名称和混合调⽤表⽰法(但是当聚合函数⽤作窗⼝函数时,它们确实能运⾏)。
更多知识尽在
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论