9、序列操做函數:
序列對象(也叫序列生成器)都是用CREATE SEQUENCE建立的特殊的單行表。一個序列對象一般用於爲行或者表生成惟一的標識符。下面序列函數,爲咱們從序列對象中獲取最新的序列值提供了簡單和併發讀取安全的方法。 node
函數 | 返回類型 | 描述 |
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 數據庫
10、條件表達式:
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)
11、數組函數和操做符:
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} |
12、系統信息函數:
1. PostgreSQL中提供的和數據庫相關的函數列表:
session
名字 | 返回類型 | 描述 |
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. 模式可視性查詢函數:
那些判斷一個對象是否在當前模式搜索路徑中可見的函數。 若是一個表所在的模式在搜索路徑中,而且沒有同名的表出如今搜索路徑的更早的地方,那麼就說這個表視可見的。 它等效於表能夠不帶明確模式修飾進行引用。
app
名字 | 描述 | 應用類型 |
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. 查詢以及修改運行時配置參數的函數:
post
名字 | 返回類型 | 描述 |
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. 數據庫對象尺寸函數:
spa
名字 | 返回類型 | 描述 |
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)