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

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

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权。

PostgreSQL允许带有命名参数的函数被使用位置或命名记号法调用。命名记号法对于有大量参数的函数特别有用,因为它让参数和实际参数之间的关联更明显和可靠。在位置记号法中,书写一个函数调用时,其参数值要按照它们在函数声明中被定义的顺序书写。在命名记号法中,参数根据名称匹配函数参数,并且可以以任何顺序书写。

在任意一种记号法中,在函数声明中给出了默认值的参数根本不需要在调用中写出。但是这在命名记号法中特别有用,因为任何参数的组合都可以被忽略。而在位置记号法中参数只能从右往左忽略。

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有两个强制参数,a和b。此外,有一个可选的参数uppercase,其默认值为false。a和b输入将被串接,并且根据uppercase参数被强制为大写或小写形式。这个函数的剩余细节对这里并不重要(详见Chapter 36)。

3.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,并导致小写形式的输出。在位置记号法中,参数可以按照从右往左被忽略并且因此而得到默认值。

3.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)

为了向后兼容性,基于 ":=" 的旧语法仍被支持:

SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World'); concat_lower_or_upper ----------------------- HELLO WORLD(1 row)

3.3. 使用混合记号

混合记号法组合了位置和命名记号法。不过,正如已经提到过的,命名参数不能超越位置参数。例如:

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

在上述查询中,参数a和b被以位置指定,而uppercase通过名字指定。在这个例子中,这只增加了一点文档。在一个具有大量带默认值参数的复杂函数中,命名的或混合的记号法可以节省大量的书写并且减少出错的机会。

Note:

命名的和混合的调用记号法当前不能在调用聚集函数时使用(但是当聚集函数被用作窗口函数时它们可以被使用)。

你可能感兴趣的文章
JEPLUS报表制作——JEPLUS软件快速开发平台
查看>>
初始化Windows powershell,连接Python
查看>>
Hardware Scaler for Performance and Efficiency
查看>>
LAMP环境搭建
查看>>
2012五大App趋势:软件开发不容小觑
查看>>
线上Nginx部署实战
查看>>
Java中需要编码的场景
查看>>
PHP生成word的三种方式
查看>>
设计模式(九)——桥接模式
查看>>
xen 创建本地存储
查看>>
TCP三次握手/四次挥手 | NAT介绍 |OSI与TCP/IP模型
查看>>
jQuery UI dialog 的使用
查看>>
程序员,其实你可以做的更好
查看>>
Hadoop Shuffle详解
查看>>
The Viewport and the Window
查看>>
自定义SpringMVC拦截器中HandlerMethod类型转换问题调研
查看>>
PostMessage And SendMessage
查看>>
Redis特性和应用场景
查看>>
SUSE 11 关闭防火墙
查看>>
spring security 3 动态获取权限
查看>>