### [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#)?
**九、序列操作函數:**
?? ?序列對象(也叫序列生成器)都是用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數據恢復處理