PostgreSQL教程(七):函数和操作符详解(3)


九、序列操作函数:

    序列对象(也叫序列生成器)都是用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官方文档,编写该篇博客的主要目的是便于今后的查阅,特此声明。 



相关阅读:
linq语法基础使用示例
基于Android AIDL进程间通信接口使用介绍
MySQL对limit查询语句的优化方法
js AppendChild与insertBefore用法详细对比
win10正式版怎么设置分辨率?win10分辨率设置
js中split函数的使用方法说明
百度Win10直通车检测ibmpmdrv.sys不兼容现象的解决方法
win7系统如何提升性能?win7使用技巧介绍
浅谈c#设计模式之单一原则
jQuery中 attr() 方法使用小结
JavaScript数组去重由慢到快由繁到简(优化篇)
win10正式版安全模式可以联网吗?win10设置安全模式上网的方法
Linux下安装PHP MSSQL扩展教程
JS+CSS设置img在DIV中只显示Img垂直居中的部分
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 草市-明城 库伦-木里图 信阳东-济南西 金山北-鹰潭北 涡阳-无锡 耒阳西-汉口 吕梁-临泽 禹城-莱阳 山河屯-吉林 娄底-怀化 麻城-涟源 潢川-十堰 华山-绥中 北京-汉口 罗源-赣州 章丘-砀山南 郑州-锦州南 铁岭西-盘锦北 汾阳-汤原 德阳-彭山北 喀什-英吉沙 绿潭-绥化 祁阳-枣庄 上海-弋江 梁平-郑州 露水河-板石河 开江-东莞东 锦州-本溪 内乡-包头 阳泉北-达拉特西 本溪-扎音河 沈阳北-渑池 营口东-本溪 沈阳-松江河 西宁-息县 通辽-卓资东 会昌北-阜阳 常州-弋江 鄂州-天水 犀浦东-红光镇 高邑-济源 杭州-襄阳 福安-福州 长葛-咸宁 龙川-芜湖 江华-武昌 武穴-西安 永丰营-新坪田 铁力-齐齐哈尔 扎兰屯-塘沽 河源-襄阳东 遂宁-沙河市 鹤壁-十堰 讷河-哈力图 株洲-太原 阳泉北-永城北 迎祥街-广顺场 湘乡-桐梓 武山-兰考 依安-昌图 月山-营山 敖汉-赤峰 铁岭-平顶山西 蚌埠-长垣 双辽-梅河口 冯屯-哈尔滨东 湘乡-蕲春 上虞北-宁德 徐州-辽阳 西街口-瓦窑田 进贤-新化 旬阳-襄阳东 庐山-商南 合肥-深圳东 中卫-定边 温州-开原 晋州-巢湖 三家子-木里图 介休东-洪洞西 汤原-公主岭 从佛山到修水的汽车,中途在哪里下车到新余最近在哪里做车好
聊城职业技术学院助学贷款怎么还没打到支付宝
明天19号从辛集到石家庄还能买到火车列车票吗急啊
帮忙查询中国邮政到英国航空包裹CP160004753CN
上海嘉定区科技管理学校到新侨学院怎么坐车
从安庆到无锡坐汽车和火车列车要多长时间啊?
邢台到石家庄坐汽车客车怎么走?车票费多少钱?%
谁知道 在长春列车火车站 到 绿圆区 和平大街 打车要多钱
贵州红果到山西大同怎么坐列车火车合适吧
从吴王阖闾到吴国灭亡同一时期发生在中国的历史事件以及吴王
烟台到海拉尔怎么坐车
7月到武汉,推荐旅游路线
锦州到遵义的火车怎么走比较省钱?
在鞍山可以买到沈阳的列车票吗
从济南到邯郸的客车票价、时间,济南客车东站有没有到邯郸的车
上海到新疆石河子的EMS几天能到呀
广州哪里有车去高州或者茂名还有惠州
求厦门2-3天游的攻略,从汕头出发,跟女友一起过去的,求热心
从宏基武汉列车火车站西站坐哪路公交
从上海到石家庄,发哪家快递最快
常州到南京的火车列车时刻表及价格
无锡春潮花园2区到新体育场怎么坐公交
怎么到达大连市孤山大街
栖霞市汽车客车站以西大约一公里,原先有个服装厂现在叫什么,厂
唐山68号小区整体拆迁吗,什么时候拆
广州到柳州的客车汽车客运站的地址有图和更详细的信息最好
济宁到济南不走高速,怎么坐车
从苏州坐汽车到南通,再怎么去火车列车站啊
从金州自驾游怎么到哈仙岛
保定到涞源怎么走

Copyright © 2016 phpStudy |