PostgreSQL教程(七):函数和操作符详解(3)
九、序列操作函数:
序列对象(也叫序列⽣成器)都是⽤CREATE SEQUENCE创建的特殊的单⾏表。⼀个序列对象通常⽤于为⾏或者表⽣成唯⼀的标识符。下⾯序列函数,为我们从序列对象中获取最新的序列值提供了简单和并发读取安全的⽅法。
函数返回
类型
描述
nextval(regclass)bigint递增序列对象到它的下⼀个数值并且返回该值。这个动作是⾃动完成的。即使多个会话并发运⾏nextval,每个进程也会安全地收到⼀个唯⼀的序列值。
currval(regclass)bigint 在当前会话中返回最近⼀次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调⽤
痘痘8种类型
过 nextval,那么会报告⼀个错误。)请注意因为此函数返回⼀个会话范围的数值,⽽且也能给出⼀个可预计的结果,因此可以⽤于判断其它会话是否执⾏过nextval。
lastval()bigint 返回当前会话⾥最近⼀次nextval返回的数值。这个函数等效于currval,只是它不⽤序列名为参数,它抓取当前会话⾥⾯最近⼀次nextval使⽤的序列。如果当前会话还没有调⽤过nextval,那么调⽤lastval将会报错。
tval(regclass, bigint)bigint重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表⽰下⼀次nextval将在返回数值之前递增该序列。
tval(regclass, bigint, boolean)bigint重置序列对象的计数器数值。功能等同于上⾯的tval函数,只是is_called可以设置为true或fal。如果将其设置为fal,那么下⼀次nextval将返回该数值,随后的nextval才开始递增该序列。
魔芋怎么做好吃
对于regclass参数,仅需⽤单引号括住序列名即可,因此它看上去就像⽂本常量。为了达到和处理普通SQL对象⼀样的兼容性,这个字串将被转换成⼩写,除⾮该序列名是⽤双引号括起,如:
复制代码代码如下:
nextval('foo') --操作序列号foo
nextval('FOO') --操作序列号foo
nextval('"Foo"') --操作序列号Foo
SELECT tval('foo', 42); --下次nextval将返回43
SELECT tval('foo', 42, true);
SELECT tval('foo', 42, fal); --下次nextval将返回42
⼗、条件表达式:
1. CASE:
SQL CASE表达式是⼀种通⽤的条件表达式,类似于其它语⾔中的if/el语句。
复制代码代码如下:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
condition是⼀个返回boolean的表达式。如果为真,那么CASE表达式的结果就是符合条件的result。如果结果为假,那么以相同⽅式搜寻随后的WHEN⼦句。如果没有WHEN condition为真,那么ca表达式的结果就是在ELSE⼦句⾥的值。如果省略了ELSE⼦句⽽且没有匹配的条件,结果为NULL,如:
复制代码代码如下:
MyTest=> SELECT * FROM testtable;
i
3
(3 rows)
MyTest=> SELECT i, CASE WHEN i=1 THEN 'one'
MyTest-> WHEN i=2 THEN 'two'
MyTest-> ELSE 'other'
MyTest-> END
MyTest-> FROM testtable;
i | ca
我的乡下同桌
衣服用英语怎么说---+-------
1 | one
2 | two
3 | other
(3 rows)
注:CASE表达式并不计算任何对于判断结果并不需要的⼦表达式。
2. COALESCE:
COALESCE返回它的第⼀个⾮NULL的参数的值。它常⽤于在为显⽰⽬的检索数据时⽤缺省值替换NULL值。
复制代码代码如下:
COALESCE(value[, ...])
和CASE表达式⼀样,COALESCE将不会计算不需要⽤来判断结果的参数。也就是说,在第⼀个⾮空参数右边的参数不会被计算。
3. NULLIF:
当且仅当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。
复制代码代码如下:
NULLIF(value1, value2)
MyTest=> SELECT NULLIF('abc','abc');
nullif
--------
(1 row)
MyTest=> SELECT NULLIF('abcd','abc');
nullif
--------
abcd
(1 row)
4. GREATEST和LEAST:
GREATEST和LEAST函数从⼀个任意的数字表达式列表⾥选取最⼤或者最⼩的数值。列表中的NULL数值将被忽略。只有所有表达式的结果都是NULL的时候,结果才会是NULL。
复制代码代码如下:
GREATEST(value [, ...])
LEAST(value [, ...])
MyTest=> SELECT GREATEST(1,3,5);
greatest
----------
5
(1 row)
MyTest=> SELECT LEAST(1,3,5,NULL);
(1 row)
⼗⼀、数组函数和操作符:
1. PostgreSQL中提供的⽤于数组的操作符列表:
操作符描述例⼦结果
=等于ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3]t
<>不等于ARRAY[1,2,3] <> ARRAY[1,2,4]t
<⼩于ARRAY[1,2,3] < ARRAY[1,2,4]t
>⼤于ARRAY[1,4,3] > ARRAY[1,2,4]t
<=⼩于或等于ARRAY[1,2,3] <= ARRAY[1,2,3]t
>=⼤于或等于ARRAY[1,4,3] >= ARRAY[1,4,3]t
||数组与数组连接ARRAY[1,2,3] || ARRAY[4,5,6]{1,2,3,4,5,6}
||数组与数组连接ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]{{1,2,3},{4,5,6},{7,8,9}}
||元素与数组连接3 || ARRAY[4,5,6]{3,4,5,6}
||元素与数组连接ARRAY[4,5,6] || 7{4,5,6,7}
2. PostgreSQL中提供的⽤于数组的函数列表:
函数返回类
型
描述例⼦结果
array_cat(anyarray, anyarray)anyarray连接两个数组array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5} array_append(anyarray,
anyelement)
anyarray向⼀个数组末尾附加⼀个元素array_append(ARRAY[1,2], 3){1,2,3} array_prepend(anyelement,
anyarray)
anyarray向⼀个数组开头附加⼀个元素array_prepend(1, ARRAY[2,3]){1,2,3} array_dims(anyarray)text返回⼀个数组维数的⽂本表⽰array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]
array_lower(anyarray, int)int返回指定的数组维数的下界array_lower(array_prepend(0,
ARRAY[1,2,3]), 1)
array_upper(anyarray, int)int返回指定数组维数的上界array_upper(ARRAY[1,2,3,4], 1)4
array_to_string(anyarray, text)text使⽤提供的分隔符连接数组元素array_to_string(ARRAY[1, 2, 3], '~^~')1~^~2~^~3 string_to_array(text, text)text[]使⽤指定的分隔符把字串拆分成
数组元素
string_to_array('xx~^~yy~^~zz', '~^~'){xx,yy,zz}⼗⼆、系统信息函数:
1. PostgreSQL中提供的和数据库相关的函数列表:
名字返回类型描述
current_databa()name当前数据库的名字
current_schema()name当前模式的名字
current_schemas(boolean)name[]在搜索路径中的模式名字
current_ur name⽬前执⾏环境下的⽤户名dnf角色找回
inet_client_addr()inet连接的远端地址
inet_client_port()int连接的远端端⼝
inet_rver_addr()inet连接的本地地址
inet_rver_port()int连接的本地端⼝
ssion_ur name会话⽤户名
pg_postmaster_start_time()timestamp postmaster启动的时间
ur name current_ur
version()text PostgreSQL版本信息
2. 允许⽤户在程序⾥查询对象访问权限的函数:
has_table_privilege(ur,table,privilege)有
访
问
表
的
权
限
SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER
has_table_privilege(table,privilege)当
前
⽤
户
是
否
有
访
问
表
的
权
限
SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER
has_databa_privilege(ur,databa,privilege)⽤
户
是
否
有
访
问
数
据
库
的
权
限
CREATE/TEMPORARY
has_databa_privilege(databa,privilege)当
前
⽤
户
是
否
有
访
问
数
据
库
的
权
限
CREATE/TEMPORARY
has_function_privilege(ur,function,privilege)⽤
户
是
否
有
访
问
函
EXECUTE
has_function_privilege(function,privilege)户
电影雷雨是
否
有
访
问
函
数
的
权
限
EXECUTE
has_language_privilege(ur,language,privilege)⽤
户
是
否
有
午夜光棍访
问
语
⾔
的
权记一次有趣的游戏
限
USAGE
has_language_privilege(language,privilege)当
前
⽤
户
是
否
有
访
问
语
⾔
的
权
限
USAGE
has_schema_privilege(ur,schema,privilege)⽤
户
是
否
有
访
问
模
式
的
权
限
CREAT/USAGE
当
前
⽤
户
是
否