### [PostgreSQL学习手册(函数和操作符<三>)](http://www.cnblogs.com/stephen-liu74/archive/2012/05/07/2295273.html)
Posted on 2012-05-07 07:41 [Stephen_Liu](http://www.cnblogs.com/stephen-liu74/) 阅读(1668) 评论(0) [编辑](http://www.cnblogs.com/stephen-liu74/admin/EditPosts.aspx?postid=2295273) [收藏](http://www.cnblogs.com/stephen-liu74/archive/2012/05/07/2295273.html#) ![](https://box.kancloud.cn/2015-10-30_5632e1b70a3bd.jpg)
**九、序列操作函数:**
序列对象(也叫序列生成器)都是用CREATE SEQUENCE创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。下面序列函数,为我们从序列对象中获取最新的序列值提供了简单和并发读取安全的方法。
| **函数** | **返回类型** | **描述** |
|-----|-----|-----|
| nextval(regclass) | bigint | 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。 |
| currval(regclass) | bigint | 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。 |
| lastval() | bigint | 返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 |
| setval(regclass, bigint) | bigint | 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。 |
| setval(regclass, bigint, boolean) | bigint | 重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为true或false。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。 |
对于regclass参数,仅需用单引号括住序列名即可,因此它看上去就像文本常量。为了达到和处理普通SQL对象一样的兼容性,这个字串将被转换成小写,除非该序列名是用双引号括起,如:
* nextval('foo') --操作序列号foo*
* nextval('FOO') --操作序列号foo*
* nextval('"Foo"') --操作序列号Foo*
* SELECT setval('foo', 42); --下次nextval将返回43*
* SELECT setval('foo', 42, true); *
* SELECT setval('foo', 42, false); --下次nextval将返回42*
**十、条件表达式:**
1. CASE:
SQL CASE表达式是一种通用的条件表达式,类似于其它语言中的if/else语句。
**CASE WHEN** condition **THEN** result
** [WHEN ...]**
[**ELSE** result]
** END**
condition是一个返回boolean的表达式。如果为真,那么CASE表达式的结果就是符合条件的result。如果结果为假,那么以相同方式搜寻随后的WHEN子句。如果没有WHEN condition为真,那么case表达式的结果就是在ELSE子句里的值。如果省略了ELSE子句而且没有匹配的条件,结果为NULL,如:
*MyTest=> SELECT * FROM testtable;*
i
---
1
2
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 | case
---+-------
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);*
least
-------
1
(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) | 0 |
| 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_database() | name | 当前数据库的名字 |
| current_schema() | name | 当前模式的名字 |
| current_schemas(boolean) | name[] | 在搜索路径中的模式名字 |
| current_user | name | 目前执行环境下的用户名 |
| inet_client_addr() | inet | 连接的远端地址 |
| inet_client_port() | int | 连接的远端端口 |
| inet_server_addr() | inet | 连接的本地地址 |
| inet_server_port() | int | 连接的本地端口 |
| session_user | name | 会话用户名 |
| pg_postmaster_start_time() | timestamp | postmaster启动的时间 |
| user | name | current_user |
| version() | text | PostgreSQL版本信息 |
2. 允许用户在程序里查询对象访问权限的函数:
| **名字** | **描述** | **可用权限** |
|-----|-----|-----|
| has_table_privilege(user,table,privilege) | 用户是否有访问表的权限 | SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER |
| has_table_privilege(table,privilege) | 当前用户是否有访问表的权限 | SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER |
| has_database_privilege(user,database,privilege) | 用户是否有访问数据库的权限 | CREATE/TEMPORARY |
| has_database_privilege(database,privilege) | 当前用户是否有访问数据库的权限 | CREATE/TEMPORARY |
| has_function_privilege(user,function,privilege) | 用户是否有访问函数的权限 | EXECUTE |
| has_function_privilege(function,privilege) | 当前用户是否有访问函数的权限 | EXECUTE |
| has_language_privilege(user,language,privilege) | 用户是否有访问语言的权限 | USAGE |
| has_language_privilege(language,privilege) | 当前用户是否有访问语言的权限 | USAGE |
| has_schema_privilege(user,schema,privilege) | 用户是否有访问模式的权限 | CREAT/USAGE |
| has_schema_privilege(schema,privilege) | 当前用户是否有访问模式的权限 | CREAT/USAGE |
| has_tablespace_privilege(user,tablespace,privilege) | 用户是否有访问表空间的权限 | CREATE |
| has_tablespace_privilege(tablespace,privilege) | 当前用户是否有访问表空间的权限 | CREATE |
* 注:以上函数均返回boolean类型。要评估一个用户是否在权限上持有赋权选项,给权限键字附加 WITH GRANT OPTION;比如 'UPDATE WITH GRANT OPTION'。*
3. 模式可视性查询函数:
那些判断一个对象是否在当前模式搜索路径中可见的函数。 如果一个表所在的模式在搜索路径中,并且没有同名的表出现在搜索路径的更早的地方,那么就说这个表视可见的。 它等效于表可以不带明确模式修饰进行引用。
| **名字** | **描述** | **应用类型** |
|-----|-----|-----|
| pg_table_is_visible(table_oid) | 该表/视图是否在搜索路径中可见 | regclass |
| pg_type_is_visible(type_oid) | 该类/视图型是否在搜索路径中可见 | regtype |
| pg_function_is_visible(function_oid) | 该函数是否在搜索路径中可见 | regprocedure |
| pg_operator_is_visible(operator_oid) | 该操作符是否在搜索路径中可见 | regoperator |
| pg_opclass_is_visible(opclass_oid) | 该操作符表是否在搜索路径中可见 | regclass |
| pg_conversion_is_visible(conversion_oid) | 转换是否在搜索路径中可见 | regoperator |
* 注:以上函数均返回boolean类型,所有这些函数都需要对象 OID 标识作为检查的对象。*
*postgres=# SELECT **pg_table_is_visible**('testtable'::**regclass**);*
pg_table_is_visible
---------------------
t
(1 row)
4. 系统表信息函数:
| **名字** | **返回类型** | **描述** |
|-----|-----|-----|
| format_type(type_oid,typemod) | text | 获取一个数据类型的SQL名称 |
| pg_get_viewdef(view_oid) | text | 为视图获取CREATE VIEW命令 |
| pg_get_viewdef(view_oid,pretty_bool) | text | 为视图获取CREATE VIEW命令 |
| pg_get_ruledef(rule_oid) | text | 为规则获取CREATE RULE命令 |
| pg_get_ruledef(rule_oid,pretty_bool) | text | 为规则获取CREATE RULE命令 |
| pg_get_indexdef(index_oid) | text | 为索引获取CREATE INDEX命令 |
| pg_get_indexdef(index_oid,column_no,pretty_bool) | text | 为索引获取CREATE INDEX命令, 如果column_no不为零,则是只获取一个索引字段的定义 |
| pg_get_triggerdef(trigger_oid) | text | 为触发器获取CREATE [CONSTRAINT] TRIGGER |
| pg_get_constraintdef(constraint_oid) | text | 获取一个约束的定义 |
| pg_get_constraintdef(constraint_oid,pretty_bool) | text | 获取一个约束的定义 |
| pg_get_expr(expr_text,relation_oid) | text | 反编译一个表达式的内部形式,假设其中的任何Vars都引用第二个参数指出的关系 |
| pg_get_expr(expr_text,relation_oid, pretty_bool) | text | 反编译一个表达式的内部形式,假设其中的任何Vars都引用第二个参数指出的关系 |
| pg_get_userbyid(roleid) | name | 获取给出的ID的角色名 |
| pg_get_serial_sequence(table_name,column_name) | text | 获取一个serial或者bigserial字段使用的序列名字 |
| pg_tablespace_databases(tablespace_oid) | setof oid | 获取在指定表空间(OID表示)中拥有对象的一套数据库的OID的集合 |
这些函数大多数都有两个变种,其中一个可以选择对结果的"漂亮的打印"。 漂亮打印的格式更容易读,但是缺省的格式更有可能被将来的PostgreSQL版本用同样的方法解释;如果是用于转储,那么尽可能避免使用漂亮打印。 给漂亮打印参数传递false生成的结果和那个没有这个参数的变种生成的结果完全一样。
**十**三**、系统管理函数:**
1. 查询以及修改运行时配置参数的函数:
| **名字** | **返回类型** | **描述** |
|-----|-----|-----|
| current_setting(setting_name) | text | 当前设置的值 |
| set_config(setting_name,new_value,is_local) | text | 设置参数并返回新值 |
current_setting用于以查询形式获取setting_name设置的当前数值。它和SQL命令SHOW是等效的。 比如:
*MyTest=# SELECT current_setting('datestyle');*
current_setting
-----------------
ISO, YMD
(1 row)
set_config将参数setting_name设置为new_value。如果is_local设置为true,那么新数值将只应用于当前事务。如果你希望新的数值应用于当前会话,那么应该使用false。它等效于SQL命令SET。比如:
* MyTest=# SELECT set_config('log_statement_stats','off', false);*
set_config
------------
off
(1 row)
2. 数据库对象尺寸函数:
| **名字** | **返回类型** | **描述** |
|-----|-----|-----|
| pg_tablespace_size(oid) | bigint | 指定OID代表的表空间使用的磁盘空间 |
| pg_tablespace_size(name) | bigint | 指定名字的表空间使用的磁盘空间 |
| pg_database_size(oid) | bigint | 指定OID代表的数据库使用的磁盘空间 |
| pg_database_size(name) | bigint | 指定名称的数据库使用的磁盘空间 |
| pg_relation_size(oid) | bigint | 指定OID代表的表或者索引所使用的磁盘空间 |
| pg_relation_size(text) | bigint | 指定名称的表或者索引使用的磁盘空间。这个名字可以用模式名修饰 |
| pg_total_relation_size(oid) | bigint | 指定OID代表的表使用的磁盘空间,包括索引和压缩数据 |
| pg_total_relation_size(text) | bigint | 指定名字的表所使用的全部磁盘空间,包括索引和压缩数据。表名字可以用模式名修饰。 |
| pg_size_pretty(bigint) | text | 把字节计算的尺寸转换成一个人类易读的尺寸单位 |
3. 数据库对象位置函数:*
*
| **名字** | **返回类型** | **描述** |
|-----|-----|-----|
| `pg_relation_filenode(relationregclass)` | oid | 获取指定对象的文件节点编号(通常为对象的oid值)。 |
| `pg_relation_filepath(relationregclass)` | text | 获取指定对象的完整路径名。 |
* mydatabase=# select pg_relation_filenode('testtable');
* pg_relation_filenode
----------------------
17877
(1 row)*
mydatabase=# select pg_relation_filepath('testtable');
* pg_relation_filepath
----------------------------------------------
pg_tblspc/17633/PG_9.1_201105231/17636/17877
(1 row)* *
* 该博客中提供的所有信息均源自PostgreSQL官方文档,编写该篇博客的主要目的是便于今后的查阅,特此声明。*
分类: [PostgreSQL](http://www.cnblogs.com/stephen-liu74/category/343171.html)
- 数据表
- 模式Schema
- 表的继承和分区
- 常用数据类型
- 函数和操作符-一
- 函数和操作符-二
- 函数和操作符-三
- 索引
- 事物隔离
- 性能提升技巧
- 服务器配置
- 角色和权限
- 数据库管理
- 数据库维护
- 系统表
- 系统视图
- SQL语言函数
- PL-pgSQL过程语言
- PostgreSQL 序列(SEQUENCE)
- PostgreSQL的时间-日期函数使用
- PostgreSQL 查看数据库,索引,表,表空间大小
- 用以查询某表的详细 包含表字段的注释信息
- PostgreSQL 系统表查看系统信息
- postgre存储过程简单实用方法
- PostgreSQL实用日常维护SQL
- PostgreSQL的时间函数使用整理
- 命令
- pg_ctl控制服务器
- initdb 初始化数据库簇
- createdb创建数据库
- dropdb 删除数据库
- createuser创建用户
- dropuser 删除用户
- psql交互式工具
- psql命令手册
- pg_dump 数据库转储
- pg_restore恢复数据库
- vacuumdb 清理优化数据库
- reindexdb 数据库重创索引
- createlang 安装过程语言
- droplang 删除过程语言
- pg_upgrade 升级数据库簇
- 调试存储过程
- 客户端命令-一
- 客户端命令-二
- 使用技巧
- PostgreSQL删除重复数据
- postgresql 小技巧
- PostgreSQL的10进制与16进制互转
- PostgreSQL的汉字转拼音
- Postgres重复数据的更新一例
- PostgreSQL使用with一例
- PostgreSQL在函数内返回returning
- PostgreSQL中的group_concat使用
- PostgreSQL数据库切割和组合字段函数
- postgresql重复数据的删除
- PostgreSQL的递归查询(with recursive)
- PostgreSQL函数如何返回数据集
- PostgreSQL分区表(Table Partitioning)应用 - David_Tang - 博客园
- PostgreSQL: function 返回结果集多列和单列的例子
- 利用pgAgent创建定时任务
- 浅谈 PostgreSQL 类型转换类似Oracle
- postgresql在windows(包括win7)下的安装配置
- PostgreSQL简介、安装、用户管理、启动关闭、创建删除数据库 (2010-11-08 12-52-51)转载▼标签: 杂谈分类: PostgreSQL
- PostgreSQL的generate_series函数应用
- PostgreSQL 8.3.1 全文检索(Full Text Search)
- postgresql record 使用
- 备份恢复
- PostgreSQL基于时间点恢复(PITR)
- Postgresql基于时间点恢复PITR案例(二)
- Postgres逻辑备份脚本
- Postgres invalid command \N数据恢复处理