Oracle PL/SQL(15) - 常用函數(shù)

Oracle SQL 提供了用于執(zhí)行特定操作的專(zhuān)用函數(shù)。這些函數(shù)增強(qiáng)了 SQL 語(yǔ)言的功能。函數(shù)可以接受零個(gè)或者多個(gè)輸入?yún)?shù),并返回一個(gè)輸出結(jié)果。 Oracle 數(shù)據(jù)庫(kù)中主要使用兩種類(lèi)型的函數(shù):

  1. 單行函數(shù):對(duì)每一個(gè)函數(shù)應(yīng)用在表的記錄中時(shí),只能輸入一行結(jié)果,返回一個(gè)結(jié)果。
    例如:MOD(x,y)返回 x 除以 y 的余數(shù)(x 和 y 可以是兩個(gè)整數(shù),也可以是表中的整數(shù)列)。常用的單行函數(shù)有:
    字符函數(shù):對(duì)字符串操作。
    數(shù)字函數(shù):對(duì)數(shù)字進(jìn)行計(jì)算,返回一個(gè)數(shù)字。
    轉(zhuǎn)換函數(shù):可以將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另外一種數(shù)據(jù)類(lèi)型。
    日期函數(shù):對(duì)日期和時(shí)間進(jìn)行處理。

  2. 聚合函數(shù):聚合函數(shù)同時(shí)可以對(duì)多行數(shù)據(jù)進(jìn)行操作,并返回一個(gè)結(jié)果。例如:SUM(x),返回結(jié)果集中 x 列的總合。

以下詳細(xì)介紹各類(lèi)函數(shù)的使用。
(1)轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)將值從一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另外一種數(shù)據(jù)類(lèi)型。
TO_DATE(X,[,fmt]) 把一個(gè)字符串以fmt格式轉(zhuǎn)換成一個(gè)日期類(lèi)型
具體如何輸出需要看本地PL/SQL的首選項(xiàng)設(shè)置時(shí)間格式設(shè)置。以下例子的輸出結(jié)果,格式均為 yyyy/mm/dd hh:mi:ss

--將字符串轉(zhuǎn)換為日期
SELECT TO_DATE('2019-12-31', 'yyyy-mm-dd') FROM DUAL;--輸出:2019/12/31
SELECT TO_DATE('2019-12-31 15:20:45', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL; --輸出:2019/12/31 15:20:45
SELECT TO_DATE('2019年12月31日', 'yyyy"年"mm"月"dd"日') AS T FROM DUAL;--輸出:2019/12/31
--兩個(gè)日期間的天數(shù)      
SELECT FLOOR(SYSDATE - TO_DATE('20191201', 'yyyymmdd')) FROM DUAL;--輸出:170
--查詢(xún)某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)
select * from  t_user l 
where l.start_date between to_date(q'/2020-05-12 00:00:00/', 'yyyy-mm-dd hh24:mi:ss')
and to_date(q'/2020-05-12 23:00:00/', 'yyyy-mm-dd hh24:mi:ss');

TO_CHAR:轉(zhuǎn)換為字符串

--日期轉(zhuǎn)化為字符串 
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') AS NOWTIME FROM DUAL;   --2020-05-19 16:09:38
--獲取時(shí)間的年
SELECT TO_CHAR(SYSDATE, 'yyyy') AS NOWYEAR FROM DUAL;          --  2020 
--獲取時(shí)間的月
SELECT TO_CHAR(SYSDATE, 'mm') AS NOWMONTH FROM DUAL;           --  05  
--獲取時(shí)間的日
SELECT TO_CHAR(SYSDATE, 'dd') AS NOWDAY FROM DUAL;             --  19 
--獲取時(shí)間的時(shí)
SELECT TO_CHAR(SYSDATE, 'hh24') AS NOWHOUR FROM DUAL;          --   16
--獲取時(shí)間的分
SELECT TO_CHAR(SYSDATE, 'mi') AS NOWMINUTE FROM DUAL;          --   10
--獲取時(shí)間的秒
SELECT TO_CHAR(SYSDATE, 'ss') AS NOWSECOND FROM DUAL;          --   26 

TO_NUMBER(X,[,fmt]) 把一個(gè)字符串以fmt格式轉(zhuǎn)換為一個(gè)數(shù)字
SELECT TO_NUMBER('-$12,345.67','$99,999.99')"num" FROM dual;
結(jié)果:-12345.67

(2)字符函數(shù)
字符函數(shù)接受字符參數(shù),這些參數(shù)可以是表中的列,也可以是一個(gè)字符串表達(dá)式。

INSTR (string, set[, start[, occurrence] ] ),該命令“string”中從“start”位置開(kāi)始查找字符集合的位置,再查找“set”出現(xiàn)的第一次、第二次等等的“occurrence”(次數(shù))?!皊tart”的值也可以是負(fù)數(shù),代表從字符串結(jié)尾開(kāi)始向反方向搜索。

select instr('abc','a') from dual;    -- 返回 1 
select instr('abc','bc') from dual; -- 返回 2
select instr('abc abc','a',1,2) from dual; -- 返回 5
select instr('abc','bc',-1,1) from dual; -- 返回 2
select instr('abc','d') from dual; -- 返回 0

LTRIM(string,trim_set)從左邊刪除字符,此處“string”是數(shù)據(jù)庫(kù)的列,或者是字面字符串,而“trim_set” 是要去掉的字符的集合。

SELECT LTRIM('abcdab','a') FROM DUAL;

結(jié)果:bcdab

RTRIM(string,trim_set)從右側(cè)刪除字符,此處“string”是數(shù)據(jù)庫(kù)的列,或者是字面字符串,而“trim_set” 是要去掉的字符的集合。

SELECT RTRIM('abcdef', 'f') FROM DUAL;

結(jié)果:abcde

REPLACE(string, if, then)用 0 或其他字符代替字符串中的字符?!癷f”是字符或字符串,對(duì)于每個(gè)出現(xiàn)在“string”中的“if”,都用“then”的內(nèi)容代替。

SELECT REPLACE('JACK and JUE','J','BL') FROM DUAL;

結(jié)果:BLACK and BLUE

SUBSTR(string, start [,count])返回“string”中截取的一部分。該命令截取“string”的一個(gè)子集,從“start”位置開(kāi)始,持續(xù)“count”個(gè)字符。如果不指定“count”,則從“start”開(kāi)始截取到“string”的尾部。

SELECT SUBSTR('ABCDEFGIJKLM',3,4) FROM DUAL;

結(jié)果:CDEF

TRANSLATE(string, if, then)“if”中字符的位置,并檢查“then”的相同位置,然后用該位置的字符替換 “string”中的字符。

SELECT TRANSLATE('sdfdfAEIOU3333','AEIOU', '1111') FROM DUAL;

結(jié)果:sdfdf11113333

UPPER(string) 返回大寫(xiě)的“string”。

SELECT UPPER('aptech computer education') FROM dual;

結(jié)果:APTECH COMPUTER EDUCATION

(3)數(shù)值型常用函數(shù)
數(shù)字函數(shù)接受數(shù)字參數(shù),參數(shù)可以來(lái)自表中的一列,也可以是一個(gè)數(shù)字表達(dá)式。

round 取四舍五入的幾位小數(shù)

select round(1.2345, 3) from dual;

結(jié)果:1.235

trunc(x,[y]) 返回截尾到y(tǒng)位小數(shù)的x值
y是正整數(shù),就是四舍五入到小數(shù)點(diǎn)后 y 位。TRUNC (5.654,2)=5.65。
y 是負(fù)整數(shù),四舍五入到小數(shù)點(diǎn)左邊|y|位。TRUNC (351.654,-2)=300。

select trunc(1.2345, 2) from dual;

結(jié)果:1.23

select     trunc(23.33)   from  dual;  

結(jié)果: 23

select trunc(1.2399, 2) from dual;

結(jié)果:1.23

select CASE WHEN trunc(1.00)-1.00=0  THEN  '整數(shù)' ELSE  '不是整數(shù)' END from dual;

結(jié)果:整數(shù)

ceil(n) 返回大于或等于x的最大整數(shù)

select  ceil(23.33)    from     dual;  

結(jié)果: 24

floor(n) 返回等于或小于n的最大整數(shù):

select    floor(23.33)   from  dual;  

結(jié)果: 23

round(n,m) 將n四舍五入,保留小數(shù)點(diǎn)后m位

select round(123.5678,2) from dual; 

結(jié)果: 123.57

select    round(23.33)  from   dual;

結(jié)果: 23

mod(m,n) m除以n的余數(shù),若n=0,則返回m

select mod(7,5) from dual; 

結(jié)果: 2

sign(n) 若n=0,則返回0,否則,n>0,則返回1,n<0,則返回-1

select sign(12) from dual; 

結(jié)果: 1

power(m,n) m的n次方

select power(3,2) from dual; 

結(jié)果: 9

sqrt(n) n的平方根

select sqrt(25) from dual ; 

結(jié)果: 5

(4)常用字符函數(shù)
字符函數(shù)接受字符參數(shù),這些參數(shù)可以是表中的列,也可以是一個(gè)字符串表達(dá)式。

initcap(char) 把每個(gè)字符串的第一個(gè)字符換成大寫(xiě)

select initicap('mr.ecop') from dual; 

結(jié)果: Mr.Ecop

lower(char) 整個(gè)字符串換成小寫(xiě)

select lower('MR.ecop') from dual; 

結(jié)果: mr.ecop

replace(char,str1,str2) 字符串中所有str1換成str2

select replace('Scott','s','Boy') from dual; 

結(jié)果: Boycott

substr(char,m,n) 取出從m字符開(kāi)始的n個(gè)字符的子串

select substr('ABCDEF',2,2) from dual; 

結(jié)果: CD

length(char) 求字符串的長(zhǎng)度

select length('ACD') from dual; 

結(jié)果: 3

|| 并置運(yùn)算符

select 'ABCD'||'EFGH' from dual; 

結(jié)果: ABCDEFGH

(5)聚合函數(shù)
聚合函數(shù)同時(shí)對(duì)一組數(shù)據(jù)進(jìn)行操作,返回一行結(jié)果,比如計(jì)算一組數(shù)據(jù)的總和,平均值等。
AVG(表達(dá)式)求平均值
SUM(表達(dá)式) 求和
MIN(表達(dá)式)、MAX(表達(dá)式) 最小值、最大值
COUNT(表達(dá)式)數(shù)據(jù)統(tǒng)計(jì)

(6)其它單行函數(shù)
NVL(exp1,exp2):如果 exp1的值為null,則返回exp2的值,否則返回exp1的值。
SELECT ename,NVL(col, 0) FROM TEST; --如果col列為null,則返回0

NVL2(exp1,exp2,exp2):
如果exp1的值為null,則返回exp2的值,否則返回exp3的值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容