Oracle 函式大全
阿新 • • 發佈:2021-06-10
Oracle SQL 提供了用於執行特定操作的專用函式。主要使用單行函式和聚合函式兩種型別的函式:
單行函式:對每一個函式應用在表的記錄中時,只能輸入一行結果,返回一個結果:字元函式、數字函式、轉換函式以及日期函式
字元函式:對字串操作,接受字元引數,這些引數可以是表中的列,也可以是一個字串表示式。
ASCII(X):返回字元X的ASCII碼
SELECT ASCII('a') FROM dual;
--結果:97
CONCAT(X,Y):連線字串X和Y
SELECT CONCAT('1','2') FROM dual;
--結果:12
INSTR(X,STR[,START][,N):從X中查詢str,可以指定從start開始,也可以指定從n開始
SELECT INSTR('abcdefgh','de') FROM dual;
--結果:4
LENGTH(X):返回X的長度
SELECT LENGTH('abcdefgh') FROM dual;
--結果:8
LOWER(X):X轉換成小寫
SELECT LOWER('ABcdefgh') FROM dual;
--結果:abcdefgh
UPPER(X):X轉換成大寫
SELECT UPPER('ABcdefgh') FROM dual;
--結果:ABCDEFGH
LTRIM(X[,TRIM_STR]):把X的左邊截去trim_str字串,預設截去空格
SELECT LTRIM('=ABcdefgh=','=') FROM dual; --結果:ABcdefgh=
RTRIM(X[,TRIM_STR]):把X的右邊截去trim_str字串,預設截去空格
SELECT RTRIM('=ABcdefgh=','=') FROM dual;
--結果:=ABcdefgh
TRIM([TRIM_STR FROM]X):把X的兩邊截去trim_str字串,預設截去空格
SELECT TRIM('='FROM'=ABcdefgh=') FROM dual;
--結果:ABcdefgh
REPLACE(X,old,new):在X中查詢old,並替換成new
SELECT REPLACE('ABCDE','CD','AAA') FROM dual; --結果:ABAAAE
SUBSTR(X,start[,length]):返回X的字串,從start處開始,擷取length個字元,預設length,預設到結尾
SELECT SUBSTR('ABCDE','2','3') FROM dual;
--結果:BCD
INITCAP:返回字元單詞首字母大寫,其餘小寫,單詞用空格和非字母字元分隔
select initcap('hEllo') name from dual;
--結果:Hello
LPAD/RPAD(string1,x[,string2]):在string1字元左邊或右邊貼上數個string2字元,直到字元總位元組數達到x位元組。string2預設為空格。
select lpad(rpad('111111',10,'*'),17,'*') NAME from dual;
--結果:*******111111****
REGEXP_REPLACE(str1,pattem[,str2[,pos[,occ[,par]]]]):用於按照特定正則表示式的規則替換字串。其中引數str1指定源字元表示式,pattem指定正則表示式,str2指定替換字串,pos指定起始搜尋位置,occ指定替換出現的第幾個字串,par指定預設匹配操作的文字串。
--將某個欄位值設定替換成空
select REGEXP_REPLACE (t.acceptordatajson,'"bankId":\d+','"bankId":""') from t_accept_log t where t.acceptordatajson like '%其它銀行%'
REGEXP_SUBSTR(str1,pattem [,pos[,occ[,par]]]):用於按照特定表示式的規則返回字串的子串。其中引數str1指定源字元表示式,pattem指定規則表示式, pos指定起始搜尋位置,occ指定替換出現的第幾個字串,par指定預設匹配操作的文字串。
SELECT REGEXP_SUBSTR('http://www.baidu.com','http://([[:alnum:]]+\.?)') a from dual;
--結果:http://www.
TRANSLATE(string,from_str,to_str):將字元string按照from_str與to_str的對應規則進行處理,返回將所出現的from_str中的每個字元替換為to_str中的相應字元以後的string. TRANSLATE是REPLACE所提供的功能的一個超集.如果from_str比to_str長,那麼在from_str中而不在to_str中而外的字元將從string中被刪除,因為它們沒有相應的替換字元. to_str不能為空.Oracle把空字串認為是NULL,並且如果TRANSLATE中的任何引數為NULL,那麼結果也是NULL.
SELECT TRANSLATE('2abc2234','01234abcde','99999XXXXX') tra from dual
--結果:9XXX9999
--查詢字串',01234,2342,2,'中逗號出現次數
select length(translate(',01234,2342,2,', 'a0123456789', ' ')) from dual;
--結果:4
數字函式:對數字進行計算,返回一個數字,接受數字引數,引數可以來自表中的一列,也可以是一個數字表達式。
ABS(X):X的絕對值
SELECT ABS('-10') FROM dual;
--結果:10
ACOS(X):X的反餘弦
SELECT ACOS(1) FROM dual;
--結果:0
COS(X):餘弦
SELECT COS(1) FROM dual;
--結果:0.54030230586814
CEIL(X):大於或等於X的最小值
SELECT CEIL(4.9) FROM dual;
--結果:5
FLOOR(X):小於或等於X的最大值
SELECT FLOOR(4.9) FROM dual;
--結果:4
LOG(X,Y):X為底Y的對數
SELECT LOG(2,8) FROM dual;
--結果:3
MOD(X,Y):X除以Y的餘數
SELECT MOD(8,3) FROM dual;
--結果:2
POWER(X,Y):X的Y次冪
SELECT POWER(2,3) FROM dual;
--結果:8
ROUND(X[,Y]):X在第Y位四捨五入
SELECT ROUND(5.45,1) FROM dual;
--結果:5.5
SQRT(X):X的平方根
SELECT SQRT(4) FROM dual;
--結果:2
TRUNC(X[,Y]):X在第Y位截斷
SELECT TRUNC(6.476,2) FROM dual;
--結果:6.47
日期函式:對日期和時間進行處理。
ADD_MONTHS(d,n):在某一個日期 d 上,加上指定的月數 n,返回計算後的新日期。
d 表示日期,n 表示要加的月數。
SELECT SYSDATE,add_months(SYSDATE,5) FROM dual;
--結果:2021/5/12 3:53:21 2021/10/12 3:53:21
LAST_DAY(d):返回指定日期當月的最後一天。
SELECT SYSDATE,last_day(SYSDATE) FROM dual;
--結果:2021/5/12 3:56:15 2021/5/31 3:56:15
ROUND(d[,fmt]):返回一個以 fmt 為格式的四捨五入日期值, d 是日期, fmt 是格式
模型。預設 fmt 為 DDD,即月中的某一天。
SELECT SYSDATE,
ROUND(SYSDATE),
ROUND(SYSDATE, 'day'),
ROUND(SYSDATE, 'month'),
ROUND(SYSDATE, 'year')
FROM DUAL;
--結果:
2021/5/12 3:57:11
2021/5/12
2021/5/9
2021/5/1
2021/1/1
EXTRACT(fmt FROM d):提取日期中的特定部分。
SELECT SYSDATE "date",
EXTRACT(YEAR FROM SYSDATE) "year",
EXTRACT(MONTH FROM SYSDATE) "month",
EXTRACT(DAY FROM SYSDATE) "day",
EXTRACT(HOUR FROM SYSTIMESTAMP) "hour",
EXTRACT(MINUTE FROM SYSTIMESTAMP) "minute",
EXTRACT(SECOND FROM SYSTIMESTAMP) "second"
FROM DUAL;
--結果:
2021/5/12 3:59:32
2021
5
12
7
59
32.248128
CURRENT_DATE:返回當前會話時區所對應的日期時間。
select CURRENT_DATE from dual;
--結果:2021/6/10 14:32:49
CURRENT_TIMESTAMP:返回當前會話時區所對應的日期時間。
select CURRENT_TIMESTAMP from dual;
--結果:10-6月 -21 02.34.20.845299 下午 +08:00
LOCALTIMESTAMP:返回當前會話時區的日期時間。
Select LOCALTIMESTAMP from dual;
--結果:10-6月 -21 02.36.17.989733 下午
MONTHS_BETWEEN(date1,date2):計算date1和date2之間相差的月數.如果date1<date2,則返回負數;如果date1,date2這兩個日期中日分量資訊是相同的,或者這兩個日期都分別是所在月的最後一天,那麼返回的結果是一個整數,否則包括一個小數,小數為富餘天數除以31,Oracle以每月31天為準計算結果。
select months_between('19-12月-2021','19-3月-2021') mon_between from dual;
--結果:9
ROUND(d[,format]):將日期d按照由format指定的格式進行四捨五入處理處理.如果沒有給format則使用預設設定DD
.
Select round(sysdate,'MONTH') from dual;
--結果:2021/6/1
SYS_EXTRACT_UTC(date):返回特定時區時間所對應的格林威治時間。
select SYS_EXTRACT_UTC(systimestamp) from dual;
--結果:10-6月 -21 06.41.59.738669 上午
SYSDATE:取得當前的日期和時間,型別是DATE.它沒有引數.但在分散式SQL語句中使用時,SYSDATE返回本地資料庫的日期和時間.
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
--結果:2021-06-10 02:42:48
SYSTIMESTAMP:返回當前系統的日期時間及時區。
SELECT systimestamp from dual;
--結果:10-6月 -21 02.44.06.551610 上午 -04:00
TO_TIMESTAMP(char[fmt[,’nls_param’]]):將符合特定日期和時間格式的字串轉變為TIMESTAMP型別。
select systimestamp from dual;
--結果:10-6月 -21 02.47.59.481088 上午 -04:00
--字元型轉成timestamp
select TO_TIMESTAMP('01-1月-03') from dual;
--結果:01-1月 -03 12.00.00.000000000 上午
select to_timestamp('01-10月-08 07.46.41.000000000 上午','dd-MON-yy hh:mi:ss.ff AM') FROM dual;
--結果:01-10月-08 07.46.41.000000000 上午
--timestamp轉成date型
select cast(TO_TIMESTAMP('2015-10-01 21:11:11.328', 'yyyy-mm-dd hh24:mi:ss.ff') as date)FROM dual;
--結果:2015/10/1 21:11:11
--date型轉成timestamp
select cast(sysdate as timestamp) date_to_timestamp FROM dual;
--結果:10-6月 -21 02.50.07.000000 上午
TO_TIMESTAMP_TZ(char[fmt[,’nls_param’]]):將符合特定日期和時間格式的字串轉變為TIMESTAMP WITH TIME ZONE型別。
select TO_TIMESTAMP_TZ('20130101','yyyymmdd') from dual;
--結果:01-1月 -13 12.00.00.000000000 上午 +08:00
TRUNC(d,format):截斷日期時間資料,計算截尾到由format指定單位的日期d.預設引數同ROUNG.
select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') FIRST, to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') second from dual;
--結果:2021.06.10 02:00:00,2021.06.10 02:52:00
轉換函式:可以將一種資料型別轉換為另外一種資料型別。
TO_CHAR(d|n[,fmt]):把日期和數字轉換為制定格式的字串。Fmt是格式化字串
SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日" HH24:MI:SS') "date" FROM DUAL;
--結果:2021年05月12日 04:01:11
TO_DATE(X,[,fmt]):把一個字串以fmt格式轉換成一個日期型別
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
--結果:2005/1/1 13:14:20
TO_NUMBER(X,[,fmt]):把一個字串以fmt格式轉換為一個數字
SELECT TO_NUMBER('-$12,345.67','$99,999.99')"num" FROM dual;
--結果:-12345.67
TO_CLOB (char):將字串轉變為CLOB型別。
Select TO_CLOB(n'test') from dual;
分組函式
分組函式也被稱為多行函式,它會根據輸入的多行資料返回一個結果。主要用於執行資料統計或彙總操作,並且分組函式只能出現在select語句選擇列表、order by子句和having子句中。注意分組函式不能直接在plsql中引用,只能在內嵌select語句中使用。
AVG([DISTINCT|ALL]col):返回一列資料的平均值,預設使用是ALL修飾符,all表示對所有的值求平均值,distinct排重後再求平均值
select avg(distinct origin_code) from t_origin;
--結果:1517406.00456621
select avg(ALL origin_code) from t_origin;
--結果:1517406.00456621
CORR([expr1,expr2):返回成對數值的相關係數,其數值使用表示式”covar_pop(expr1,expr2)/(stddev_pop(expr1)*stddev_pop(expr2))”
select corr(origin_code,leaf) from t_origin;
--結果:0.787679048632485
COUNT(*|[DISTINCT|ALL] col):得到查詢中行的數
SELECT count(distinct origin_code) from t_origin;
--結果:219
COVAR_POP(expr1,expr2):返回成對數字的協方差,其數值使用表示式”(sum(expr1expr2)-sum(expr1)sum(expr2)/n)/n”
Select COVAR_POP(origin_code,ID) from t_origin;
--結果:985452046305418
COVAR_SAMP(expr1,expr2):返回成對數字的協方差,其數值使用表示式”(sum(expr1expr2)-sum(expr1)sum(expr2)/n)/n-1”
Select COVAR_SAMP(origin_code,ID) from t_origin;
--結果:989972468536177
CUME_DIST(expr1,expr2…) within group (order by expr1,expr2…):返回特定數值在一組行資料中的累積分佈比例。
Select CUME_DIST(4) within group (order by origin_code) from t_origin;
--結果:0.0909090909090909
DENSE_RANK(expr1,expr2…) within group (order by expr1,expr2…):返回特定資料在一組行資料中的等級。
Select DENSE_RANK (4) within group (order by origin_code) from t_origin;
--結果:20
GROUPING(expr):用於確定統計結果是否使用了特定的表示式,返回0則用到了表示式,1則未用。
SELECT SID,
CID,
COUNT(1),
GROUPING(SID),
GROUPING(CID)
FROM SC
GROUP BY ROLLUP(SID, CID);
GROUPING_ID(expr1[,expr2]…):返回對應於特定行的grouping位向量的值。
SELECT SID, CID, SUM(SCORE), GROUPING_ID(SID, CID)
FROM SC
GROUP BY ROLLUP(SID, CID)
MAX([DISTINCT|ALL]col):獲得選擇列表或表示式的最大值,ALL表示對所有的值求最大值,DISTINCT表示對不同的值求最大值,相同的只取一次
select max(distinct score) from SC;
--結果:99
MIN([DISTINCT|ALL]col):獲得選擇列表或表示式的最小值,ALL表示對所有的值求最小值,DISTINCT表示對不同的值求最小值,相同的只取一次
select min(all score) from SC;
--結果:20
PERCENT_RANK(expr1,expr2…)WITHIN GROUP (ORDER BY expr1,expr2…):返回特定數值在統計級別中所佔的比例。
select percent_rank(3000) within group(order by score) from sc;
--結果:1
PERCENTILE_CONT(percent_expr)WITHIN GROUP (ORDER BY expr):返回在統計級別中處於某個百分點的特定數值(按照連續分佈模型確定)。
select percentile_cont(.6) within group(order by score) from sc;
--結果:80
PERCENTILE_DISC(percent_expr)WITHIN GROUP (ORDER BY expr):返回在統計級別中處於某個百分點的特定數值(按照離散分佈模型確定)。
select PERCENTILE_DISC(.6) within group(order by score) from sc;
--結果:80
RANK(expr1,expr2…)WITHIN GROUP (ORDER BY expr1,expr2…):返回特定數值中所佔據的等級。
select rank(50) within group(order by score) from sc;
--結果:5
STDDEV([DISTINCT|ALL]col):獲得選擇列表的標準差
select stddev(score) from sc;
--結果:24.9593132970729
select stddev(distinct score) from sc;
--結果:27.6194707558846
STDDEV_POP(col):返回統計標準差,其數值是統計方差的平方根.
select stddev_pop(score) from sc;
--結果:24.2560925272674
STDDEV_SAMP(col):返回取樣標準差,其數值是取樣方差的平方根.
select stddev_samp(score) from sc;
--結果:24.9593132970729
SUM([DISTINCT|ALL]col):返回選擇的數值和總和
Select sum(score) from sc;
--結果:1234
VAR_POP([DISTINCT|ALL]col):返回統計方差.使用公式為(sum(exprexpr)-sum(expr)sum(expr)/count(expr))/(count(expr)
select VAR_POP (score) from sc;
--結果:588.358024691358
VAR_SAMP([col):返回取樣方差.使用公式為(sum(exprexpr)-sum(expr)sum(expr)/count(expr))/(count(expr-1)
select variance (score) from sc;
--結果:622.967320261438
VARIANCE([DISTINCT|ALL]col):返回選擇列或表示式的取樣方差.使用公式為(sum(exprexpr)-sum(expr)sum(expr)/count(expr))/(count(expr-1)
select variance(score) from sc;
--結果:622.967320261438
其他函式
COALESCE(exp1,exp2,exp3,...):依次查詢各引數,遇到非NULL則返回,各引數或表示式資料型別必須一致,如果都為null則返回null。
Select COALESCE(SID,cid) from sc;
DECODE(base_expr,comparel,valuel,Compare2,value2,…default):把base_expr與後面的每個compare(n)進行比較,如果匹配返回相應的value (n).如果沒有發生匹配,則返回default,每個valuel資料型別必須一致,如果沒有default則返回null。
Select decode(a,'金',1,'銀',2,0) from table_name;
NULLIF (expr1, expr2):比較表示式expr1和expr2,相等返回null,否則返回expr1.
Select nullif(expr1, expr2) from table_name;
NVL (expr1, expr2):將NULL轉變為實際值,如果expr1是NULL,那麼返回expr2,否則返回expr1,expr1、expr2兩者必須為同類型或expr2可以隱式轉換為expr1,否則會報錯。
Select nvl(column_name,0) from tbale_name;
NVL2 (expr1, expr2, expr3):expr1不為NULL,返回expr2;expr1為NULL,返回expr3。expr1可以是任意資料型別;expr2與expr3可以是除LONG外的任意資料型別,但需要型別一致或expr3可以隱式轉換為expr2。
SELECT NVL2(to_date('01-jun-2016'),sysdate - to_date('01-jun-2016'),sysdate) FROM dual;