PostgreSQL學習手冊(函式和操作符<三>)
九、序列操作函式:
序列物件(也叫序列生成器)都是用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(relation regclass) | oid | 獲取指定物件的檔案節點編號(通常為物件的oid值)。 |
pg_relation_filepath(relation regclass) | 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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9521459/viewspace-759336/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL學習手冊(函式和操作符)SQL函式
- PostgreSQL學習手冊(函式和操作符<一>)SQL函式
- PostgreSQL學習手冊(函式和操作符<二>)SQL函式
- PostgreSQL學習手冊(SQL語言函式)SQL函式
- PostgreSQL學習手冊(索引)SQL索引
- PostgreSQL學習手冊(角色和許可權)SQL
- PostgreSQL學習手冊(模式Schema)SQL模式
- PostgreSQL學習手冊(資料表)SQL
- PostgreSQL學習手冊(事物隔離)SQL
- PostgreSQL學習手冊(系統表)SQL
- PostgreSQL學習手冊(表的繼承和分割槽)SQL繼承
- PostgreSQL學習手冊(客戶端命令)SQL客戶端
- PostgreSQL學習手冊(效能提升技巧)SQL
- PostgreSQL學習手冊(資料庫管理)SQL資料庫
- PostgreSQL學習手冊(系統檢視)SQL
- PostgreSQL學習手冊(伺服器配置)SQL伺服器
- 函式學習三函式
- PostgreSQL學習手冊(常用資料型別)SQL資料型別
- PostgreSQL學習手冊(資料庫維護)SQL資料庫
- PostgreSQL學習手冊(客戶端命令<一>)SQL客戶端
- PostgreSQL學習手冊(客戶端命令<二>)SQL客戶端
- 字串函式學習三字串函式
- PostgreSQL學習手冊(PL/pgSQL過程語言)SQL
- NIST 函式手冊函式
- PHP 手冊 (類與物件) 學習筆記五:建構函式和解構函式PHP物件筆記函式
- 函式文件或者手冊函式
- oracle函式手冊(轉)Oracle函式
- C庫函式手冊函式
- ORACLE分析函式手冊Oracle函式
- Flutter狀態管理學習手冊(三)——BlocFlutterBloC
- ORACLE分析函式手冊(轉)Oracle函式
- 函式-PHP手冊筆記函式PHP筆記
- ORACLE分析函式手冊二Oracle函式
- PHP 手冊 (類與物件) 學習筆記八:範圍解析操作符 ( :: )PHP物件筆記
- Redux學習手冊Redux
- ITIL學習手冊
- Vue學習(三)生命週期函式Vue函式
- ORACLE分析函式手冊二(轉)Oracle函式