PostgreSQL函數
- 一、數學函數
- 1.1、絕對值函數ABS(x)和圓周率函數PI()
- 1.2、平方根函數SQRT(x)和求余函數MOD(x,y)
- 1.3、取整函數CEIL(x)、CEILING(x)和FLOOR(x)
- 1.4、四舍五入函數ROUND(x)和ROUND(x,y)
- 1.5、符號函數SIGN(x)
- 1.6、冪運算函數POW(x,y)、POWER(x,y)和EXP(x)
- 1.7、對數運算函數LOG(x)
- 1.8、角度與弧度轉換函數RADIANS(x)和DEGREES(x)
- 1.9、正弦函數SIN(x)和反正弦函數ASIN(x)
- 1.10、余弦函數COS(x)和反余弦函數ACOS(x)
- 1.11、正切函數、反正切函數和余切函數
- 二、字符串函數
- 2.1、字符串字符數CHAR_LENGTH(str)和字符串長度函數LENGTH(s)
- 2.2、合并字符串函數CONCAT(s1, s2,...)和CONCAT_WS(x,s1,s2,...)
- 2.3、獲取指定長度的字符串函數LEFT(s,n)和RIGHT(s,n)
- 2.4、填充字符串函數LPAD(s1,len,s2)和RPAD(s1,len,s2)
- 2.5、刪除空格函數LTRIM(s)、RTRIM(s)和TRIM(s)
- 3.6、刪除指定字符串函數TRIM(s1 FROM s)
- 3.7、重復生成字符串函數REPEAT(s,n)
- 3.8、替換函數REPLACE(s, s1, s2)
- 3.9、獲取子串函數SUBSTRING(s,n,len)
- 2.10、匹配子串開始位置函數POSITION(str1 IN str)
- 2.11、字符串逆序函數REVERSE(s)
- 三、日期和時間函數
- 3.1、獲取當前日期函數CURRENT_DATE和獲取當前時間函數CURRENT_TIME、LOCALTIME
- 3.2、獲取當前日期和時間的函數
- 3.3、獲取日期指定值函數EXTRACT(type FROM d)
- 3.4、日期和時間運算操作
- 四、條件判斷函數
- 4.1、CASE value WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE m] END
- 4.2、CASE WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END
- 五、系統信息函數
- 5.1、獲取PostgreSQL版本號VERSION()
- 5.2、獲取用戶名函數USER和CURRENT_USER
- 六、加密函數
- 6.1、加密函數MD5(str)
- 6.2、加密函數ENCODE(str, pswd_str)
- 6.3、解密函數DECODE(crypt_str, pswd_str)
- 七、改變數據類型函數CAST(x AS type)
一、數學函數
數學函數主要用來處理數值數據,主要的數學函數有:絕對值函數、三角函數(包括正弦函數、余弦函數、正切函數、余切函數等)、對數函數、隨機數函數等。當有錯誤產生時,數學函數
會返回空值NULL。
1.1、絕對值函數ABS(x)和圓周率函數PI()
SELECT ABS(2), ABS(-3.3), ABS(-33);
-- 保留15位有效數字
SELECT PI();
1.2、平方根函數SQRT(x)和求余函數MOD(x,y)
SQRT(x)返回非負數x的二次平方根。
SELECT SQRT(9), SQRT(40);
MOD(x,y)返回x被y除后的余數,MODO對于帶有小數部分的數值也起作用,它返回除法運算后的精確余數。
SELECT MOD(31,8), MOD(234, 10), MOD(45.5, 6);
1.3、取整函數CEIL(x)、CEILING(x)和FLOOR(x)
CEIL(x)和CEILING(x)意義相同,返回不小于x的最小整數值,返回值轉化為一個BIGINT。
SELECT CEIL(-3.35), CEILING(3.35);
FLOOR(x)返回不大于x的最大整數值,返回值轉化為一個BIGINT。
SELECT FLOOR(-3.35), FLOOR(3.35);
1.4、四舍五入函數ROUND(x)和ROUND(x,y)
ROUND(x)返回最接近于參數x的整數,對x值進行四舍五入。
SELECT ROUND(-1.14), ROUND(-1.67), ROUND(1.14), ROUND(1.66);
ROUND(x,y)返回最接近于參數x的數,其值保留到小數點后面y位,若y為負值,則將保留x值到小數點左邊y位。
SELECT ROUND(1.38, 1), ROUND(1.38, 0), ROUND(232.38, -1), ROUND(232.38, -2);
1.5、符號函數SIGN(x)
SIGN(x)返回參數的符號,x的值為負、零或正時,返回結果依次為-1、0或1。
SELECT SIGN(-21), SIGN(0), SIGN(21);
1.6、冪運算函數POW(x,y)、POWER(x,y)和EXP(x)
POW(x,y)或者POWER(x,y)函數返回x的y次乘方的結果值。
SELECT POW(2,2), POWER(2, 2), POW(2, -2), POWER(2, -2);
EXP(x)返回e的x乘方后的值。
SELECT EXP(3), EXP(-3), EXP(0);
1.7、對數運算函數LOG(x)
LOG(x)返回x的自然對數,x相對于基數?的對數。對數定義域不能為負數,否則將會彈出錯誤信息。
SELECT LOG(3);
1.8、角度與弧度轉換函數RADIANS(x)和DEGREES(x)
RADIANS(x)將參數x由角度轉化為弧度。
SELECT RADIANS(90), RADIANS(180);
DEGREES(x)將參數x由弧度轉化為角度。
SELECT DEGREES(PI()), DEGREES(PI() / 2);
1.9、正弦函數SIN(x)和反正弦函數ASIN(x)
SN(x)返回x的正弦,其中,x為弧度值。
SELECT SIN(1), ROUND(SIN(PI()));
ASN(x)返回x的反正弦,即正弦為x的值。若x不在-1到1的范圍之內,則會彈出錯誤信息:“輸入超出范圍”。
SELECT ASIN(0.8414709848078965), ASIN(3);
1.10、余弦函數COS(x)和反余弦函數ACOS(x)
COS(x)返回x的余弦,其中x為弧度值。
SELECT COS(0), COS(PI()), COS(1);
ACOS(x)返回x的反余弦,即余弦是x的值。若x不在-1到1的范圍之內,則會彈出錯誤信息。
SELECT ACOS(1), ACOS(0);
1.11、正切函數、反正切函數和余切函數
TAN(x)返回x的正切,其中x為給定的弧度值。
SELECT TAN(0.3), ROUND(TAN(PI() / 4));
ATAN(x)返回x的反正切,即正切為x的值。
SELECT ATAN(0.30933624960962325), ATAN(1);
COT(x)返回x的余切。
SELECT COT(0.3), 1 / TAN(0.3), COT(PI() / 4);
二、字符串函數
2.1、字符串字符數CHAR_LENGTH(str)和字符串長度函數LENGTH(s)
CHAR LENGTH(str)
返回值為字符串sr所包含字符的個數。一個多字節字符算作一個單字符。
SELECT CHAR_LENGTH('date'), CHAR_LENGTH('egg');
LENGTH(s)
返回值為字符串的字節長度,使用utf8編碼字符集時,一個漢字是3個字節,一個數字或字母算作一個字節。
SELECT LENGTH('date'), LENGTH('egg');
可以看到,計算的結果與CHAR LENGTH相同,因為英文字符的個數和所占的字節相同,一個字符占一個字節。
2.2、合并字符串函數CONCAT(s1, s2,…)和CONCAT_WS(x,s1,s2,…)
CONCAT(sI,s2,...)
返回結果為連接參數產生的字符串。如果有任何一個參數為NULL,則返回值為NULL:如果所有參數均為非二進制字符串,則結果為非二進制字符串;如果自變量中含有任何一個二進制字符串,則結果為一個二進制字符串。
SELECT CONCAT('PostgreSQL', '9.15'), CONCAT('Postgre', NULL, 'SQL');
CONCAT WS(x,sl,s2,...)
,其中,CONCAT WS代表CONCAT With Separator,是CONCATO的特殊形式。第一個參數x是其他參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其他參數。如果分隔符為NULL,則結果為NULL。函數會忽略任何分隔符參數后的NULL值。
SELECT CONCAT_WS('-', '1st', '2nd', '3rd'), CONCAT_WS('*', '1st', NULL, '3rd');
2.3、獲取指定長度的字符串函數LEFT(s,n)和RIGHT(s,n)
LEFT(s,n)返回字符串s開始的最左邊n個字符。
SELECT LEFT('football', 5);
RIGHT(s,n)返回字符串s最右邊n個字符。
SELECT RIGHT('football', 4);
2.4、填充字符串函數LPAD(s1,len,s2)和RPAD(s1,len,s2)
LPAD(sl,len,s2)返回字符串sl,其左邊由字符串s2填充,填充至len字符長度。假如sl的長度大于len,則返回值被縮短至len字符。
SELECT LPAD('hello', 4, '?'), LPAD('hello', 10, '?');
RPAD(sl,len,s2)返回字符串sl,其右邊被字符串s2填充至len字符長度。假如sl的長度大于len,則返回值被縮短到與len字符相同長度。
SELECT RPAD('hello', 4, '?'), RPAD('hello', 10, '?');
2.5、刪除空格函數LTRIM(s)、RTRIM(s)和TRIM(s)
LTRIM(s)返回字符串s,字符串左側空格字符被刪除。
SELECT '( book )', CONCAT('(', LTRIM(' book '), ')');
RTRIM(s)返回字符串s,字符串右側空格字符被刪除.
SELECT '( book )', CONCAT('(', RTRIM(' book '), ')');
TRIM(s)刑除字符串s兩側的空格。
SELECT '( book )', CONCAT('(', TRIM(' book '), ')');
3.6、刪除指定字符串函數TRIM(s1 FROM s)
TRIM(s1 FROM s)刪除字符串s中兩端所有的子字符串s1。s1為可選項,在未指定情況下,別除空格。
SELECT TRIM('xy' FROM 'xyboxyokxyxy');
3.7、重復生成字符串函數REPEAT(s,n)
REPEAT(s,n)返回一個由重復的字符串s組成的字符串,n表示重復生成的次數。若n<=0,則返回一個空字符串。若s或n為NULL,則返回NULL。
SELECT REPEAT('PostgreSQL', 3);
3.8、替換函數REPLACE(s, s1, s2)
REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。
SELECT REPLACE('xxx.PostgreSQL.com', 'x', 'w');
3.9、獲取子串函數SUBSTRING(s,n,len)
SUBSTRING(s,n,len)表示從字符串s返回一個長度為len的子字符串,起始于位置n。也可能對n使用一個負值。假若這樣,則子字符串的位置起始于字符串結尾的n字符,即倒數第n個字符。
SELECT SUBSTRING('breakfast', 5) AS col1,SUBSTRING('breakfast', 5, 3) AS col2,SUBSTRING('luch', -3) AS col3;
2.10、匹配子串開始位置函數POSITION(str1 IN str)
POSITION(strl IN str)函數的作用是返回子字符串strl在字符串str中的開始位置。
SELECT POSITION('ball' IN 'football');
2.11、字符串逆序函數REVERSE(s)
REVERSE(s)將字符串s反轉,返回的字符串的順序和s字符順序相反。
SELECT REVERSE('abc');
三、日期和時間函數
3.1、獲取當前日期函數CURRENT_DATE和獲取當前時間函數CURRENT_TIME、LOCALTIME
CURRENT_DATE函數的作用是將當前日期按照YYYY-MM-DD’格式的值返回,具體格式根據函數用在字符串或是數字語境中而定。
SELECT CURRENT_DATE;
CURRENT_TIME函數的作用是將當前時間以HH:MM:SS’的格式返回,具體格式根據函數用在字符串或是數字語境中而定。
SELECT CURRENT_TIME;
LOCALTIME函數的作用是將當前時間以’HH:MM:SS’的格式返回,唯一和CURRENT_TIME函數不同的是,返回的是不帶時區的值。
SELECT LOCALTIME;
3.2、獲取當前日期和時間的函數
CURRENT_TIMESTAMP
、LOCALTIMESTAMP
和NOW()
3個函數的作用相同,即返回當前日期和時間值,格式為YYYY-MM-DDHH:MM:SS或YYYYMMDDHHMMSS,具體格式根據函數是否用在字符串或數字語境而定。
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP, NOW();
可以看到,3個函數返回的日期和時間是相同的。唯一不同的是,LOCALTIMESTAMP函數的返回值不帶時區。
3.3、獲取日期指定值函數EXTRACT(type FROM d)
EXTRACT(ype FROM date)函數從日期中提取其部分,而不是執行日期運算。
SELECT EXTRACT(DAY FROM TIMESTAMP '2012-09-10 10:18:40'),EXTRACT(MONTH FROM TIMESTAMP '2012-09-10 10:18:40'),EXTRACT(YEAR FROM TIMESTAMP '2012-09-10 10:18:40');
-- 使用EXTRACT函數查詢指定日期是一年中的第幾天
SELECT EXTRACT(DOY FROM TIMESTAMP '2012-09-10 10:18:40');
-- 使用EXTRACT函數查詢指定日期是一周中的星期幾
SELECT EXTRACT(DOW FROM TIMESTAMP '2012-09-10 10:18:40');
-- 使用EXTRACT函數查詢指定日期是該年的第幾季度(1~4)
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2012-09-10 10:18:40');
3.4、日期和時間運算操作
-- 計算指定日期加上間隔天數后的結果
SELECT DATE '2012-09-28' + integer '10';
-- 計算指定日期加上間隔小時后的結果
SELECT DATE '2012-09-28' + interval '3 hour';
-- 計算指定日期加上指定時間后的結果
SELECT DATE '2012-09-28' + time '06:00';
-- 計算指定日期和時間加上間隔時間后的結果
SELECT TIMESTAMP '2012-09-28 02:00:00' + interval '10 hours';
-- 計算指定日期之間的間隔天數
SELECT DATE '2012-11-01' - DATE '2012-09-10';
-- 計算指定日期減去間隔天數后的結果
SELECT DATE '2012-11-01' - INTEGER '10';
-- 計算整數與天數相乘的結果
SELECT 15 * interval '2 day';
-- 計算整數與秒數相乘的結果
SELECT 50 * interval '2 second';
-- 計算小時數與整數相除的結果
SELECT interval '1 hour' / integer '2';
四、條件判斷函數
4.1、CASE value WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE m] END
該函數表示,如果value值等于某個vn,則返回對應位置THEN后面的結果:如果與所有值都不相等,則返回ELSE后面的m。
SELECT CASE 2 WHEN 1 THEN 'one'WHEN 2 THEN 'two'ELSE 'more' END;
4.2、CASE WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END
該函數表示,某個vn值為TRUE時,返回對應位置THEN后面的結果:如果所有值都不為TRUE,則返回ELSE后的m。
SELECT CASE WHEN 1 < 0 THEN 'true'ELSE 'false' END;
五、系統信息函數
5.1、獲取PostgreSQL版本號VERSION()
VERSIONO返回指示PostgreSQL服務器版本的字符串。這個字符串使用utf8字符集。
SELECT VERSION();
5.2、獲取用戶名函數USER和CURRENT_USER
USER和CURRENT_USER函數返回當前被PostgreSQL服務器驗證的用戶名。這個值符合有定當前登錄用戶存取權限的PostgreSQL賬戶。一般情況下,這兩個函數的返回值是相同的。
SELECT USER, CURRENT_USER;
六、加密函數
6.1、加密函數MD5(str)
MD5(st)為字符串算出一個MD5128比特檢查和。該值以32位十六進制數字的二進制字符串的形式返回,若參數為NULL則會返回NULL。
SELECT MD5('mypwd');
6.2、加密函數ENCODE(str, pswd_str)
ENCODE(str,pswd_str)使用pswd_str作為加密編碼,來加密str。常見的加密編碼包括:base64、hex和escape.
SELECT ENCODE('secret', 'hex'), LENGTH(ENCODE('secret', 'hex'));
6.3、解密函數DECODE(crypt_str, pswd_str)
DECODE(crypt_str,pswd_str)使用pswd_str作為密碼,解密加密字符串crypt_str,cypt_str是由ENCODEO返回的字符串。
SELECT DECODE(ENCODE('secret', 'hex'), 'hex');
七、改變數據類型函數CAST(x AS type)
CAST(x,AS type)函數將一個類型的值轉換為另一個類型的值。
SELECT CAST(100 AS CHAR(2));
可以看到,CAST(100 AS CHAR(2)將整數數據100轉換為帶有2個顯示寬度的字符串類型,結果為10。