博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL调用函数
阅读量:4324 次
发布时间:2019-06-06

本文共 2011 字,大约阅读时间需要 6 分钟。

允许函数有命名参数,可以被位置名称表示法调用。名称表示法对有大量参数的函数特别有用,因为它更加明确和可靠的标记了形参和实参之间的联系。在位置表示法里,一个函数调用的参数值要用与函数声明相同的顺序来写出。在名称表示法里,参数是通过名称来与函数参数相匹配的,可以以任意顺序写出。

不管用那种表示法,在函数声明时给出的有默认值的参数在调用时不必写出。但是这在名称表示法中是特别有用的,因为参数的任意组合都是可以省略的。而在位置表示法中,参数只能从右到左省略。

PostgreSQL也支持混合表示法,混合表示法结合了位置和名称表示法。因为这个原因,先写位置参数然后跟着写命名参数。

下面的例子将说明三种表示法的用法,使用下面的函数定义:

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)RETURNS textAS$$ SELECT CASE        WHEN $3 THEN UPPER($1 || ' ' || $2)        ELSE LOWER($1 || ' ' || $2)        END;$$LANGUAGE SQL IMMUTABLE STRICT;

函数concat_lower_or_upper有两个强制的参数,ab。此外第三个参数是一个可选参数uppercase,默认为falseab输入将被串联,并且将根据uppercase 参数强制为大写或者小写。

1. 使用位置表示法

PostgreSQL中,位置表示法是传递参数到函数的传统机制。一个例子是:

SELECT concat_lower_or_upper('Hello', 'World', true); concat_lower_or_upper ----------------------- HELLO WORLD(1 row)

所有的参数都按顺序指定。因为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)

在上面的查询中,参数auppercase是用位置声明的,而 uppercase是用名称声明的。在这个例子中,添加了文档中没有的一点。在一个有多个参数有默认值的更复杂的函数中,名称或者混合表示法可以节省很多敲键,并且可以减少犯错的几率。

注意: 在调用一个聚合函数时,目前不能使用名称和混合调用表示法(但是当聚合函数用作窗口函数时,它们确实能运行)。

更多知识尽在

转载于:https://www.cnblogs.com/wolaiye320/p/5577041.html

你可能感兴趣的文章
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_2_Properties集合中的方法store...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_6_字符输出流写数据的其他方法...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_2_BufferedOutputStream_字节缓冲...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_8_使用try_catch_finally处理流中的异常...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_1_使用Properties集合存储数据,遍历取出集合中的数据...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_4_缓冲流的效率测试_复制文件...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_3_Properties集合中的方法load...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_6_BufferedReader_字符缓冲输入流...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_7_练习_对文本的内容进行排序...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_1_字符编码和字符集...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_2_编码引出的问题_FileReader读取GBK格式文件...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_3_转换流的原理...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_4_OutputStreamWriter介绍&代码实现...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_5_InputStreamReader介绍&代码实现...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_6_练习_转换文件编码...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_1_序列化和反序列化的概述...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream...
查看>>