PostgreSQL學習手冊(函式和操作符<二>)
六、模式匹配:
PostgreSQL中提供了三種實現模式匹配的方法:SQL LIKE操作符,更近一些的SIMILAR TO操作符,和POSIX-風格正規表示式。
1. LIKE:
string LIKE pattern [ ESCAPE escape-character ]
string NOT LIKE pattern [ ESCAPE escape-character ]
每個pattern定義一個字串的集合。如果該string包含在pattern代表的字串集合裡,那麼LIKE表示式返回真。和我們想象的一樣,如果
LIKE返回真,那麼NOT
LIKE表示式返回假,反之亦然。在pattern裡的下劃線(_)代表匹配任何單個字元,而一個百分號(%)匹配任何零或更多字元,如:
'abc' LIKE 'abc' true
'abc' LIKE 'a%' true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false
要匹配文字的下劃線或者百分號,而不是匹配其它字元,在pattern裡相應的字元必須前導轉義字元。預設的轉義字元是反斜槓,但是你可以用ESCAPE子句指定一個。要匹配轉義字元本身,寫兩個轉義字元。我們也可以通過寫成ESCAPE ''的方式有效地關閉轉義機制,此時,我們就不能關閉下劃線和百分號的特殊含義了。
關鍵字ILIKE可以用於替換LIKE,令該匹配就當前的區域設定是大小寫無關的。這個特性不是SQL標準,是PostgreSQL的擴充套件。操作符~~等效於LIKE, 而~~*對應ILIKE。還有!~~和!~~*操作符分別代表NOT LIKE和NOT ILIKE。所有這些操作符都是PostgreSQL特有的。
2. SIMILAR TO正規表示式:
SIMILAR TO根據模式是否匹配給定的字串而返回真或者假。
string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]
它和LIKE非常類似,支援LIKE的萬用字元('_'和'%')且保持其原意。除此之外,SIMILAR TO還支援一些自己獨有的元字元,如:
1). | 標識選擇(兩個候選之一)。
2). * 表示重複前面的項零次或更多次。
3). + 表示重複前面的項一次或更多次。
4). 可以使用圓括弧()把項組合成一個邏輯項。
5). 一個方括弧表示式[...]宣告一個字元表,就像POSIX正規表示式一樣。
見如下示例:
'abc' SIMILAR TO 'abc' true
'abc' SIMILAR TO 'a' false
'abc' SIMILAR TO '%(b|d)%' true
'abc' SIMILAR TO '(b|c)%' false
帶三個引數的substring,substring(string
from pattern for
escape-character),提供了一個從字串中抽取一個匹配SQL正規表示式模式的子字串的函式。和SIMILAR
TO一樣,宣告的模式必須匹配整個資料串,否則函式失效並返回NULL。為了標識在成功的時候應該返回的模式部分,模式必須出現後跟雙引號(")的兩個轉
義字元。匹配這兩個標記之間的模式的字串將被返回,如:
MyTest=# SELECT substring('foobar' from '%#"o_b#"%' FOR '#'); --這裡#是轉義符,雙引號內的模式是返回部分。
substring
-----------
oob
(1 row)
MyTest=# SELECT substring('foobar' from '#"o_b#"%' FOR '#'); --foobar不能完全匹配後面的模式,因此返回NULL。
substring
-----------
(1 row)
七、資料型別格式化函式:
PostgreSQL格式化函式提供一套有效的工具用於把各種資料型別(日期/時間、integer、floating
point和numeric)轉換成格式化的字串以及反過來從格式化的字串轉換成指定的資料型別。下面列出了這些函式,它們都遵循一個公共的呼叫習
慣:第一個引數是待格式化的值,而第二個是定義輸出或輸出格式的模板。
函式 | 返回型別 | 描述 | 例子 |
to_char(timestamp, text) | text | 把時間戳轉換成字串 | to_char(current_timestamp, 'HH12:MI:SS') |
to_char(interval, text) | text | 把時間間隔轉為字串 | to_char(interval '15h 2m 12s', 'HH24:MI:SS') |
to_char(int, text) | text | 把整數轉換成字串 | to_char(125, '999') |
to_char(double precision, text) | text | 把實數/雙精度數轉換成字串 | to_char(125.8::real, '999D9') |
to_char(numeric, text) | text | 把numeric轉換成字串 | to_char(-125.8, '999D99S') |
to_date(text, text) | date | 把字串轉換成日期 | to_date('05 Dec 2000', 'DD Mon YYYY') |
to_timestamp(text, text) | timestamp | 把字串轉換成時間戳 | to_timestamp('05 Dec 2000', 'DD Mon YYYY') |
to_timestamp(double) | timestamp | 把UNIX紀元轉換成時間戳 | to_timestamp(200120400) |
to_number(text, text) | numeric | 把字串轉換成numeric | to_number('12,454.8-', '99G999D9S') |
1. 用於日期/時間格式化的模式:
模式 | 描述 |
HH | 一天的小時數(01-12) |
HH12 | 一天的小時數(01-12) |
HH24 | 一天的小時數(00-23) |
MI | 分鐘(00-59) |
SS | 秒(00-59) |
MS | 毫秒(000-999) |
US | 微秒(000000-999999) |
AM | 正午標識(大寫) |
Y,YYY | 帶逗號的年(4和更多位) |
YYYY | 年(4和更多位) |
YYY | 年的後三位 |
YY | 年的後兩位 |
Y | 年的最後一位 |
MONTH | 全長大寫月份名(空白填充為9字元) |
Month | 全長混合大小寫月份名(空白填充為9字元) |
month | 全長小寫月份名(空白填充為9字元) |
MON | 大寫縮寫月份名(3字元) |
Mon | 縮寫混合大小寫月份名(3字元) |
mon | 小寫縮寫月份名(3字元) |
MM | 月份號(01-12) |
DAY | 全長大寫日期名(空白填充為9字元) |
Day | 全長混合大小寫日期名(空白填充為9字元) |
day | 全長小寫日期名(空白填充為9字元) |
DY | 縮寫大寫日期名(3字元) |
Dy | 縮寫混合大小寫日期名(3字元) |
dy | 縮寫小寫日期名(3字元) |
DDD | 一年裡的日子(001-366) |
DD | 一個月裡的日子(01-31) |
D | 一週裡的日子(1-7;週日是1) |
W | 一個月裡的週數(1-5)(第一週從該月第一天開始) |
WW | 一年裡的週數(1-53)(第一週從該年的第一天開始) |
2. 用於數值格式化的模板模式:
模式 | 描述 |
9 | 帶有指定數值位數的值 |
0 | 帶前導零的值 |
.(句點) | 小數點 |
,(逗號) | 分組(千)分隔符 |
PR | 尖括號內負值 |
S | 帶符號的數值 |
L | 貨幣符號 |
D | 小數點 |
G | 分組分隔符 |
MI | 在指明的位置的負號(如果數字 < 0) |
PL | 在指明的位置的正號(如果數字 > 0) |
SG | 在指明的位置的正/負號 |
八、時間/日期函式和操作符:
1. 下面是PostgreSQL中支援的時間/日期操作符的列表:
操作符 | 例子 | 結果 |
+ | date '2001-09-28' + integer '7' | date '2001-10-05' |
+ | date '2001-09-28' + interval '1 hour' | timestamp '2001-09-28 01:00' |
+ | date '2001-09-28' + time '03:00' | timestamp '2001-09-28 03:00' |
+ | interval '1 day' + interval '1 hour' | interval '1 day 01:00' |
+ | timestamp '2001-09-28 01:00' + interval '23 hours' | timestamp '2001-09-29 00:00' |
+ | time '01:00' + interval '3 hours' | time '04:00' |
- | - interval '23 hours' | interval '-23:00' |
- | date '2001-10-01' - date '2001-09-28' | integer '3' |
- | date '2001-10-01' - integer '7' | date '2001-09-24' |
- | date '2001-09-28' - interval '1 hour' | timestamp '2001-09-27 23:00' |
- | time '05:00' - time '03:00' | interval '02:00' |
- | time '05:00' - interval '2 hours' | time '03:00' |
- | timestamp '2001-09-28 23:00' - interval '23 hours' | timestamp '2001-09-28 00:00' |
- | interval '1 day' - interval '1 hour' | interval '23:00' |
- | timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' | interval '1 day 15:00' |
* | interval '1 hour' * double precision '3.5' | interval '03:30' |
/ | interval '1 hour' / double precision '1.5' | interval '00:40' |
2. 日期/時間函式:
函式 | 返回型別 | 描述 | 例子 | 結果 |
age(timestamp, timestamp) | interval | 減去引數,生成一個使用年、月的"符號化"的結果 | age('2001-04-10', timestamp '1957-06-13') | 43 years 9 mons 27 days |
age(timestamp) | interval | 從current_date減去得到的數值 | age(timestamp '1957-06-13') | 43 years 8 mons 3 days |
current_date | date | 今天的日期 | ||
current_time | time | 現在的時間 | ||
current_timestamp | timestamp | 日期和時間 | ||
date_part(text, timestamp) | double | 獲取子域(等效於extract) | date_part('hour', timestamp '2001-02-16 20:38:40') | 20 |
date_part(text, interval) | double | 獲取子域(等效於extract) | date_part('month', interval '2 years 3 months') | 3 |
date_trunc(text, timestamp) | timestamp | 截斷成指定的精度 | date_trunc('hour', timestamp '2001-02-16 20:38:40') | 2001-02-16 20:00:00+00 |
extract(field from timestamp) | double | 獲取子域 | extract(hour from timestamp '2001-02-16 20:38:40') | 20 |
extract(field from interval) | double | 獲取子域 | extract(month from interval '2 years 3 months') | 3 |
localtime | time | 今日的時間 | ||
localtimestamp | timestamp | 日期和時間 | ||
now() | timestamp | 當前的日期和時間(等效於 current_timestamp) | ||
timeofday() | text | 當前日期和時間 |
3. EXTRACT,date_part函式支援的field:
域 | 描述 | 例子 | 結果 |
CENTURY | 世紀 | EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); | 20 |
DAY | (月分)裡的日期域(1-31) | EXTRACT(DAY from TIMESTAMP '2001-02-16 20:38:40'); | 16 |
DECADE | 年份域除以10 | EXTRACT(DECADE from TIMESTAMP '2001-02-16 20:38:40'); | 200 |
DOW | 每週的星期號(0-6;星期天是0) (僅用於timestamp) | EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); | 5 |
DOY | 一年的第幾天(1 -365/366) (僅用於 timestamp) | EXTRACT(DOY from TIMESTAMP '2001-02-16 20:38:40'); | 47 |
HOUR | 小時域(0-23) | EXTRACT(HOUR from TIMESTAMP '2001-02-16 20:38:40'); | 20 |
MICROSECONDS | 秒域,包括小數部分,乘以 1,000,000。 | EXTRACT(MICROSECONDS from TIME '17:12:28.5'); | 28500000 |
MILLENNIUM | 千年 | EXTRACT(MILLENNIUM from TIMESTAMP '2001-02-16 20:38:40'); | 3 |
MILLISECONDS | 秒域,包括小數部分,乘以 1000。 | EXTRACT(MILLISECONDS from TIME '17:12:28.5'); | 28500 |
MINUTE | 分鐘域(0-59) | EXTRACT(MINUTE from TIMESTAMP '2001-02-16 20:38:40'); | 38 |
MONTH | 對於timestamp數值,它是一年裡的月份數(1-12);對於interval數值,它是月的數目,然後對12取模(0-11) | EXTRACT(MONTH from TIMESTAMP '2001-02-16 20:38:40'); | 2 |
QUARTER | 該天所在的該年的季度(1-4)(僅用於 timestamp) | EXTRACT(QUARTER from TIMESTAMP '2001-02-16 20:38:40'); | 1 |
SECOND | 秒域,包括小數部分(0-59[1]) | EXTRACT(SECOND from TIMESTAMP '2001-02-16 20:38:40'); | 40 |
WEEK | 該天在所在的年份裡是第幾周。 | EXTRACT(WEEK from TIMESTAMP '2001-02-16 20:38:40'); | 7 |
YEAR | 年份域 | EXTRACT(YEAR from TIMESTAMP '2001-02-16 20:38:40'); | 2001 |
4. 當前日期/時間:
我們可以使用下面的函式獲取當前的日期和/或時間∶
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME (precision)
CURRENT_TIMESTAMP (precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME (precision)
LOCALTIMESTAMP (precision)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9521459/viewspace-759335/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE分析函式手冊二(轉)Oracle函式
- 函式學習二函式
- 字串函式學習二字串函式
- TypeScript學習(二)—— 函式TypeScript函式
- PHP 手冊 (類與物件) 學習筆記五:建構函式和解構函式PHP物件筆記函式
- 【GO學習二】包,函式,常量和變數Go函式變數
- JavaScript學習筆記(二)——函式和陣列JavaScript筆記函式陣列
- oracle函式手冊(轉)Oracle函式
- 函式文件或者手冊函式
- ORACLE分析函式手冊(轉)Oracle函式
- Flutter狀態管理學習手冊(二)——ReduxFlutterRedux
- Python學習手冊之控制結構(二)Python
- PHP 手冊 (類與物件) 學習筆記八:範圍解析操作符 ( :: )PHP物件筆記
- iOS學習筆記42 Swift(二)函式和閉包iOS筆記Swift函式
- C++學習筆記(二)——函式C++筆記函式
- Redux學習手冊Redux
- (二)Flutter學習之Dart展開操作符 和 Control Flow CollectionsFlutterDart
- PHP 第二週函式學習記錄PHP函式
- 詳解 JavaScript 建構函式和 "new" 操作符JavaScript函式
- Python學習手冊之類和繼承Python繼承
- 函式學習函式
- Arduino參考手冊-函式和變數及電路圖UI函式變數
- Js函式和物件學習體會JS函式物件
- python學習手冊(8)Python
- python學習手冊(10)Python
- python學習手冊(4)Python
- ES6深入學習(二)關於函式函式
- 確定不收藏?機器學習必備的分類損失函式速查手冊機器學習函式
- 【Andrew Ng 機器學習】Week 1(二):代價函式和梯度下降機器學習函式梯度
- spark RDD的學習,filter函式的學習,split函式的學習SparkFilter函式
- React學習手冊-React執行機制筆記(二)React筆記
- PHP 手冊 (類與物件) 學習筆記二:屬性PHP物件筆記
- 物聯網學習教程—函式引數和函式的值函式
- MySQL函式學習(一)-----字串函式MySql函式字串
- 易優標籤常用函式-EyouCms手冊函式
- RxJava 學習筆記 -- 條件操作符和布林操作符RxJava筆記
- 函式學習五函式
- 函式學習四函式
- 函式學習六函式