您好,登錄后才能下訂單哦!
小編給大家分享一下Oracle常用函數有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
LOWER函數用小寫形式替換字符串中的大寫字符。語法:LOWER(s).
select lower(100+100),lower('SQL'),lower(sysdate) from dual;
UPPER函數用大寫形式替換字符串中的小寫字符。語法:UPPER(s).
select upper('sql') from dual;
INITCAP函數將字符串轉換為首字母大寫的形式。字符串中每個單詞的第一個字母都被轉換為大寫形式,面每個單詞余下的字母被轉換為小寫字母形式。單詞之間用空格或者下劃線分開,但有些字符(如百分比符號(%)、感嘆號(!)或者美元符號($))也都是有效的單詞分隔符。標點符號和特殊字符也是有效的單詞分隔符。語法:INITCAP(s)
select initcap('init cap or init_cat or init%cap') from dual;
CONCAT函數連接兩個字符字面值、列或者表達式從而生成一個更大的字字符表達式。語法:CONCAT(s1,s2)
select concat('Today is:',SYSDATE) FROM DUAL;
CONCAT只能使用兩個參數
select concat('Outer1 ',concat('Inner1',' Inner2')) from dual;
LENGTH函數返回組成字符串的字符數。空格、制表符和特殊字符都被LENGTH函數計算在內。只有一個參數,LENGTH(s)。(制表符算1)
select length('ab cd e') from dual;
LPAD(RPAD)函數返回給定字符串左(右)邊填充指定數量的字符后形成的合成字符串。用于填充的字符串包括字符字面值、列值、表達式、空格(默認)、制表符和特殊字符。
LPAD和RPAD函數有三個參數,語法:RPAD(s,n,p)和LPAD(s,n,p)。s表示源字符串,n表示返回字符串的最終長度,p指定用于填充的字符串。
select LPAD('abc',6,'*'),RPAD('abc',6,'*') from dual;
TRIM函數從字符值的開頭或結尾刪除一些字符,從面生成一個更簡短的字符項。
TRIM函數使用的參數由一個強制組成部分和一個可選組成部分構成。語法:TRIM([trailing|leading|both] trimstring from s)。被修整的字符串(s)是強制的。只能指定一個修正字符。
TRIM(s)刪除輸入字符串兩邊的空格。
TRIM(trailing trimstring from s) 從字符串s的結尾刪除所有trimstring(如果存在的話)。
TRIM(leading trimstring from s) 從字符串s的開頭刪除所有trimstring(如果存在的話)。
TRIM(both trimstring from s) 從字符串s的開頭和結尾刪除所有trimstring(如果存在的話)。
select trim(both '*' from '*****Hidden*****'),trim(leading '*' from '*****Hidden*****'),trim(trailing '*' from '*****Hidden*****'),trim(both from ' Hidden '),trim(trailing from ' Hidden'),trim(leading from 'Hidden ') from dual;
RTRIM函數從字符值的結尾刪除一些字符,從而生成一個更簡短的字符串。
語法:RTRIM(string[,trimstring]),被修整的string是必須的,可以刪除多個字符。默認刪除空格。
select rtrim('abcd ') from dual;
select rtrim('abcd***','*') from dual; select rtrim('abcd*#','*#') from dual;
LTRIM函數從字符值的開頭刪除一些字符,從而生成一個更簡短的字符串。
語法:RTRIM(string[,trimstring]),被修整的string是必須的,可以刪除多個字符。默認刪除空格。
select ltrim(' abcd') from dual;
select ltrim('***abcd','*') from dual; select ltrim('*#abcd','*#') from dual;
INSTR函數確定搜索字符串在給定字符串內的位置。它返回數字位置,在這個位置上,搜索字符串開始第n次出現(相對于指定的起始位置而言)。如果搜索字符串不存在,則返回0.
INSTR函數使用兩個可選參數和兩個強制參數。語法:INSTR(source string,search string,[search start position],[nth occurrence])。search start position的默認值是1或者source string的開頭。nth occurrence 的默認值是1或者第一次出現。
select instr('1#3#5#7#9#','#') from dual;
從左第1個字符往右,返回'#'第1次出現的位置。
select instr('1#3#5#7#9#','#',5) from dual;
從左第5個字符往右,返回'#'第1次出現的位置。
select instr('1#3#5#7#9#','#',3,4) from dual;
從左第3個字符往右,返回'#'第4次出現的位置。
select instr('1#3#5#7#9#','#',3,10) from dual;
從左第3個字符往右,返回'#'第10次出現的位置,沒有找到返回0.
select instr('1#3#5#7#9#','#',-1) from dual;
從右第1個字符往左,返回'#'第1次出現的位置。
select instr('1#3#5#7#9#','#',-1,3) from dual;
從右第1個字符往左,返回'#'第3次出現的位置。
select instr('1#3#5#7#9#','#',-3,3) from dual;
從右第3個字符往左,返回'#'第3次出現的位置。
SUBSTR函數從給定源字符串中給定的位置開始,提取指定長度的字符串。如果起始位置大于源字符串的長度,就會返回null。如果從給定起始位置提取的字符數大于源字符串的長度,返回的部分是從起始位置到字符串結尾的子字符串。
SUBSTR函數有三個參數,前兩個是強制的。語法:SUBSTR(source string,start position,[number of characters to extract])。要提取的默認字符數是從start position 到source string 結尾的字符數。
select substr('1#3#5#7#9#',5) from dual;
從從左到右數第5個字符處開始提取,從左到右提取,一直到源字符串結尾。
select substr('1#3#5#7#9#',5,3) from dual;
從從左到右數第5個字符處開始提取,從左到右提取,提取3個字符。
select substr('1#3#5#7#9#',-3,2) from dual;
從從右到左數第3個字符處開始提取,從左到右提取,提取2個字符。
select substr('1#3#5#7#9#',-3,-2) from dual;
空
REPLACE函數用替換項取代源字符串中出現的所有搜索項。如果替換項的長度與搜索項的長度不同,那么返回字符串的長度與源字符串的長度也不同。如果沒有找到搜索字符串,就會原封不動的返回源字符串。
REPLACE函數有三個參數,前兩個是強制的。語法:REPLACE(source string,search item[,replacement term])。如果省略replacement term參數,就會從source string 中刪除所有出現的search item。
select replace('1#3#5#7#9#','#','->') from dual;
select replace('1#3#5#7#9#','#') from dual;
ROUND函數依據指定的小數精度對數值進行舍入運算。返回依據有效數字以指定的小數精度進行上舍入或者下舍入的值。如果指定的的小數精度為n,則要舍入的有效數據在小數點右邊(n+1)個位置。如果n為負數,那么要舍入的有效數字在小數點右邊n個位置。如果有效數據的數據大于或者等于5,就進行“上舍入”,其他情況進行“下舍入”。
ROUND函數有兩個參數。語法:ROUND(source number,decimal precision)。source number參數表示任何數字值。decimal precision參數指定舍入的精度,它是可選的。如果沒有指定decimal precision參數,則舍入的默認精度是0,也就是說將源數字舍入為最接近的整數。
select round(1601.916,1) from dual;
select round(1601.916,2) from dual;
select round(1601.916,-1) from dual;
select round(1601.916,-3) from dual;
select round(1601.916) from dual;
TRUNC函數依據指定的小數精度對數據執行截取運算。數字截取不同于舍入,如果小數精度的正數的話,最后的值依據指定的小數精度刪除數字,并不進行向上或者向下舍入。然而,如果指定的小數精度(n)為負數,輸入值從小數點左邊第n個數位開始向后歸0。
TRUNC函數有兩個參數。語法:TRUNC(source number,decimal precision)。Source number表示任何數字值。Decimal precision指定截取的精度,它是可選的。如果沒有指定decimal precision參數,那么默認精度為0,即將source number截取到最接近的整數。
select trunc(1601.916,1) from dual;
select trunc(1601.916,2) from dual;
select trunc(1601.916,-1) from dual;
select trunc(1601.916,-3) from dual;
select trunc(1601.916) from dual;
MOD函數返回除法運算的余數。提供兩個數——被除數和除數,執行除法運算。如果除數是被除數的因數,MOD就返回0,因為沒有余數。如果除數等于0,則返回no division by zero錯誤,MOD函數也返回0。如果除數大于被除數,那么MOD函數返回被除數作為結果。
MOD函數有兩個參數。語法:MOD(dividend,divisor)。dividend和divisor參數都可以表示數字字面值、列或者表達式。可以是正數也可以是負數。
select mod(6,2) from dual;
select mod(5,3) from dual;
select mod(7,35) from dual;
select mod(5.2,3) from dual;
select mod(-5,3) from dual;
MOD函數通常用來區分奇數和偶數。
SYSDATE函數沒有參數,它返回數據庫服務器當前的系統日期和時間。
select sysdate from dual;
Date1-Date2=Num1
可以從另一個日期中減去日志。這兩個日期項之間的差值表示它們之間的天數。可以將所有數字(包括小數)添加到日期項或者從日期項中減去。在該上下文中,數字表示天數。數字和日期項之間的和或者差值總是返回日期項。不允許相加、相乘或者相除兩個日期項。
select to_date('31-jan-01')-to_date('01-jan-01') from dual;
select sysdate + 1 from dual;
MONTHS_BETWEEN函數返回表示兩個強制的日期參數之間月數的數值。語法:MONTHS_BETWEEN(date1,date2)。計算date1和date2之間朋份的差值(每月31天)。如果date1在date2之前就反加負數。這兩個日期參數之間的差值可能由整數和小數部分組成。整數表示這兩個日期之間的朋數。小數部分表示計算年和月之間整數差值這后剩余的天數和時間,以31天的月份為基礎。如果要比較的日期的日組成部分相同或者是各自月份的最后一天,那么就返回沒有小數部分的整數。
select months_between(sysdate,sysdate-31) from dual;
select months_between('29-mar-2008','28-feb-2008') from dual;
select months_between('29-mar-2008','28-feb-2008')*31 from dual;
ADD_MONTHS函數返回日期項,這個日期項通過將指定月數添加到給定日期計算得出。
ADD_MONTHS函數有兩個強制參數。語法:ADD_MONTHS(start date,number of months)。在將指定的月數添加到start date之后,函數才計算目標日期。月數可能是負數,這樣返回的目標日期就早于起始日期。number of months可以是小數,但會忽略小數部分,而使用整數部分。
select add_months('07-APR-2009',1) from dual;
select add_months('07-APR-2009',2.5) from dual;
select add_months('07-APR-2009',-12) from dual;
NEXT_DAY函數返回的日期是星期內指定的日子下一次出現時的日期。
NEXT_DAY函數有兩個強制參數。語法:NEXT_DAY(start date,day of the week)。函數計算在start date之后day of the week參數下一次出現的日期。day of the week參數可以是字符值或者整數值。可接受的值由NLS_DATE_LANGUATE數據庫參數確定,但默認值至少是日子名稱的前三個字符或者整數值,其中1表示星期日,2表示星期一,以此類推。在任何情況下都應該指定表示星期幾的字符值。簡短名稱可以大于三個字符,例如星期日可以表示為sun、sund、sunda或者sunday。
select next_day('01-JAN-2009','tue') from dual;
select next_day('01-JAN-2009','WEDNE') from dual;
select next_day('01-JAN-2009',5) from dual;
LAST_DAY函數返回指定日子所屬的月的最后一天的日期。
LAST_DAY函數有一個強制參數。語法:LAST_DAY(start date)。該函數提取start date參數所屬的月,并計算該月最后一天的日期。
select LAST_DAY('01-JAN-2009') from dual;
日期ROUND函數依據指定的日期精度格式對值進行舍入運算。返回的值要么向上舍入要么向下舍入為最接近的日期精度格式。
日期ROUND函數使用一個強制參數和一個可選參數。語法:ROUND(source date[,date precision format])。source date參數表示任意日期項。date precision format參數指定舍入的精度,是可選的,如果沒有指定,默認的舍入精度是日。date precision formats 包括世紀(CC)、年(YYYY)、季度(Q)、月(MM)、星期(W)、日(DD)、時(HH)和分(MI)。
向上傳入到世紀相當于給當前世紀加1個世紀。如果日部分大于16,就會向上舍入到下一個月,否則就會向下舍入到當月的開頭。如果月在1和6之間,那么舍入到年就會返回當年開頭的日期,否則返回下一年開頭的日期。
select round(sysdate) day,round(sysdate,'w') week,round(sysdate,'month') month,round(sysdate,'year') year from dual;
select round(sysdate,'cc') cc,round(sysdate,'q') q,round(sysdate,'hh'),round(sysdate,'mi') min hour from dual;
日期TRUNC函數依據指定的日期精度格式對值進行截取運算。
日期TRUNC函數使用一個強制參數和一個可選參數。語法:TRUNC(source date[,date precision format])。source date參數表示任意日期項。date precision format 參數指定截取的精度,它是可選的,如果沒有指定,默認的截取精度是日。即source date的所有時間部分都設置為午夜(00:00:00)。月級別上的截取將source date的日期設置為該月的第一天。年級別上的截取返回當年開頭的日期。
select trunc(sysdate) day,trunc(sysdate,'w') week,trunc(sysdate,'month') month,trunc(sysdate,'year') year from dual;
如果可能,可以將數據類型與函數所需參數的數據類型不相符的值隱式轉換為所需的格式。VARCHAR2和CHAR數據類型統稱為字符類型。字符字段非常靈活,幾乎允許存儲所有類型的信息。因此,可以方便地將DATE和NUMBER值轉換為它們的字符形式。這些轉換稱為數字到字符(number to character)和日期到字符(date to character)轉換。
select length(1234567890) from dual;
select length(0123456789) from dual;
select length(sysdate) from dual;.
將字符數據隱式轉換為數字數據類型的情況并不常見,因為出現這種情況的唯一條件是該字符數據表示有效數字。
當字符串符合下面的日期格式時,可以實現隱式字符到日期(character to date)的轉換:[D|DD] separator1 [MON|MONTH] separator2 [R|RR|YY|YYYY]。D和DD分別表示月份中1位和2位的日子。MON是月的三字符縮寫詞,而MONTH是月的全名。R和RR分別表示滿意位和2位數字的年。YY和YYYY分別表示2位和4位數字的年。separator1和separator2元素可以是大多數標點符號、空格和制表符。
'24-JAN-09' DD-MON-RR
'1\\january/8' D\\MONTH/R
'13*jan*8' DD*MON*R
'13/feb/2008' DD/MON/YYYY
'01$jan/08' DD$MON/RR
'24-JAN-09 18:45' DD-MON-RR HH24:MI
TO_CHAR函數返回VARCHAR2數據類型的值。當將它應用于NUMBER數據類型的值時TO_CHAR(num1[,format mask[,nls_parameters]])
num參數是強制性的,它必須是一個數字值。可選的format參數用來指定數字格式信息——例如寬度、貨幣符號、小數點的位置和組(或者千位)分隔符,必須將它們包含在單引號內。除此之外,對于要轉換為字符的數字而言,還有其他一些格式信息的選項。
select to_char(00001) from dual;
select to_char(00001,'099999') from dual;
TO_CHAR函數將數據轉換為字符
格式元素 | 元素說明 | 格式 | 數字 | 字符結果 |
9 | 數字寬度 | 9999 | 12 | 12 |
0 | 顯示前面的0 | 09999 | 0012 | 00012 |
. | 小數點的位置 | 09999.999 | 030.40 | 00030.400 |
D | 小數分隔符的位置(默認為名點) | 09999D999 | 030.40 | 00030.400 |
, | 逗號的位置 | 09999,999 | 03040 | 00003,040 |
G | 組分隔符的位置(默認為逗號) | 09999G999 | 03040 | 00003,040 |
$ | 美元 | $099999 | 03040 | $003040 |
L | 當地貨幣 | L099999 | 03040 | GBP003040(如果nls_currency設置為GBP) |
MI | 表示負數的減號的位置 | 99999MI | -3040 | 3040- |
PR | 包圍在括號內的負數 | 99999PR | -3040 | <3040> |
EEEE | 科學計數法 | 99.99999EEEE | 121.976 | 1.21976E+02 |
U | Nls_dual_currency | U099999 | 03040 | CAD003040(如果nls_dual_currency設置為CAD) |
V | 乘以10n次(n是V之后9的數量) | 9999V99 | 3040 | 304000 |
S | 前面加上+或者- | S999999 | 3040 | +3040 |
使用TO_CHAR函數,可以利用各種格式模型將DATE項轉換為幾乎所有日期的字符表示形式。
語法:TO_CHAR(date1[,format[,nls_parameter]])
只有date1參數是強制的,date1必須是可以被隱式轉換為日期的值。可選的format參數區分大小寫,必須獎它包含在單引號內。格式掩碼指定哪些日期元素,是用長的名稱還是用縮寫名稱來描述這個元素。還會自動給日和月的名稱填充空格。可以使用格式掩碼的修飾符來刪除這些空格,這個修飾符稱為填充模式(fm)運算符。在格式模型之前添加字母fm,就會命令Oracle從日和月的名稱中刪除所有空格。對于被轉換為字符串的日期而言還有許多格式選項。
select to_char(sysdate) || ' is today''s date' from dual;
select to_char(sysdate,'Month') || 'is special time ' from dual;
select to_char(sysdate,'fmMonth') || 'is special time ' from dual;
to_char把日期轉換為字符串
假設格式元素作用于日期02-JUN-1975
格式元素 | 說明 | 結果 |
Y | 年的最后一位 | 5 |
YY | 年的最后兩位 | 75 |
YYY | 年的最后三位 | 975 |
YYYY | 4位數字表示的年 | 1975 |
RR | 兩們數字表示的年(已知世紀) | 75 |
YEAR,year,Year | 區分大小寫并用英語拼寫的年 | NINETEEN SEVENTY FIVE, Nineteen seventy five, Nineteen Seventy Five |
MM | 兩位數表示的月 | 06 |
MON,mon,Mon | 月的三個字母縮寫 | JUN,jun,Jun |
MONTH,month,Month | 區分大小寫并用英語拼寫的月 | JUNE,june,June |
D | 星期的第幾天 | 2 |
DD | 月的兩位數日 | 02 |
DDD | 年的日 | 153 |
DY,dy,Dy | 星期的三個字母縮寫 | MON,mon,Mon |
DAY,day,Day | 區分大小寫并用英語拼寫的星期 | MONDAY,Monday,Monday |
提取日期時間數據類型的時間部分,表中使用的日期為27-JUN-2010 21:35:13
格式元素 | 說明 | 結果 |
AM,PM,A.M.和P.M. | 子午線指示器 | PM |
HH、HH2和HH24 | 一天的小時,1-12時和0-23時 | 09,09,21 |
MI | 分(0~59) | 35 |
SS | 秒(0~59) | 13 |
SSSSS | 午夜之后的秒(0~86399) | 77713 |
其他一些能夠在日期時間格式模型中使用的元素。標點符號用來分隔格式元素。有三種類型的后綴可以格式化日期時間元素的組件。而且,如果將字符字面值包含在雙引號內,那么就能夠在返回值中包含它們。使用日期12/SEP/08 14:31
格式元素 | 說明和格式掩碼 | 結果 |
/ . , ? # ! - | 標點符號:’MM.YY’ | 09.08 |
“any character literal” | 字符字面值:’”Week” W “of” Month’ | Week 2 of September |
TH | 位置或者序數文本:’DDth ”of” Month’ | 12TH of September |
SP | 拼寫出數字:’MmSP month Yyyysp’ | Nine September Two Thousand Eight |
THSP or SPTH | 拼寫出位置或者序數:’hh34SpTh’ | Fourteenth |
TO_DATE函數返回DATE類型的值。轉換為日期的字符串可能包含所有或者部分組成DATE的日期時間元素。當只轉換包含日期時間元素子集的字符串時,Oracle提供資金默認值來構造完整的日期。字符串的組成部分通過格式模型或掩碼與不同的日期時間元素相關聯。
語法:TO_DATE(string1[,format,[nls_parameter]])
只有string1參數是強制性的,如果沒有提供格式掩碼,string1會隱式轉換為日期。幾乎總是使用可選的fromat參數,在單引號內指定它,與TO_CHAR的格式掩碼相同。TO_DATE函數有fx修飾,表示string1和格式掩碼必須完全匹配,否則報錯。
select to_date('25-DEC-2010') from dual;
select to_date('25-DEC') from dual; --錯誤
select to_date('25-DEC','DD-MON') from dual;
select to_date('25-DEC-2010 18:03:45','DD-MON-YYYY HH24:MI:SS') from dual;
select to_date('25-DEC-10','fxDD-MON-YYYY') from dual;--錯誤
TO_NUMBER函數返回NUMBER類型的值。轉換為數字的字符串必須有合適的格式,以便用相應的格式掩碼轉換或刪除所有非數字組成部分。
語法:TO_NUMBER(string1[,format,[nls_parameter]])
只有string1參數是強制性的,如果沒有提供格式掩碼,string1就必須是可以隱式轉換為數字的值。用單引號指定可選的format參數。與TO_CHAR轉換數字到字符串中的格式掩碼相同。
select to_number('$1,000.55') from dual;--錯誤
select to_number('$01,000.55','$0999,999.999') from dual;
注:TO_NUMBER函數將字符項轉換為數字。如果使用較短的格式掩碼轉換數字,就會返回錯誤,如果使用較長的格式掩碼轉換數字,就會返回原數字。
NVL函數評估任何數據類型的列或者表達式是不是空值。如果原始項是空值,返回備選的非空值;否則,返回原始項。
NVL函數有兩個強制參數。語法:NVL(original,ifnull)。其中original表示要測試的項,如果original項計算為空,就返回ifnull。original和ifnull參數的數據類型必須一致。它們必須是相同的類型,或者可能將ifnull隱式轉換為original參數的類型。NVL函數返回值的數據類型與original參數的數據類型相同。
select nvl(1234) from dual;--錯誤
select nvl(null,1234) from dual; ---1234
select nvl(substr('abc',4),'No substring exists') from dual;
NVL2函數是對NVL函數的增強,但功能非常類似。NVL2函數評估任何數據類型的列或者表達式是不是空值。如果第一項不是空值,那么返回第二個參數,否則返回第三個參數。
NVL2函數有三個強制參數。語法:NVL2(original,ifnotnull,ifnull),其中original表示被測試的項。如果original不是空值,就返回ifnotnull;如果original是空值,就返回ifnull。ifnotnull和ifnull參數的數據類型必須一致或者ifnull參數可以轉換為ifnotnull參數的數據類型,它們不能是LONG數據類型。它們可以是相同的類型,或者可以將ifnull轉換為ifnotnull參數的類型。NVL2函數返回的數據類型與ifnotnull參數的數據類型相同。
select nvl2(1234,1,'a string') from dual; --錯誤
select nvl2(null,1234,5678) from dual; --5678
select nvl2(substr('abc',2),'Not bc','No substring') from dual;
NULLIF函數測試兩項的相等性。如果它們相等,函數就返回空值,否則返回這兩個測試項的第一項。
NULLIF函數有兩個可以是任何數據類型的強制參數,兩個參數類型必須一致,第一個參數不可以為空。語法:NULLIF(ifunequal,comparison_term),其中比較參數ifunequal和comparison_term。如果它們相同,返回NULL。如果它們不同,返回ifunequal參數。
select nullif(1234,1234) from dual;
select nullif('24-JUL-2009','24-JUL-09') from dual;
select nullif(1,null) from dual; --1
select nullif(null,null) from dual;----返回ORA-00932: inconsistent datatypes: expected - got CHAR
COALESCE函數從參數列表中返回第一個非空值。如果所有參數為空,那么返回空值。
COALESCE函數有兩個強制參數和任何數量的可選參數。語法:COALESCE(expr1,expr2,...,exprn),如果expr1不是空值,就返回它,否則,如果expr2不是空值,就返回它,以此類推。COALESCE函數是NVL函數的一般形式:
COALESCE(expr1,expr2)=NVL(expr1,expr2)
COALESCE(expr1,expr2)=NVL(expr1,NVL(expr2,expr3))
如果找到非空值,COALESCE返回的數據類型與第一個非空參數的數據類型相同。為了避免出現“ORA-00931:inconsistent date types”錯誤,所有非空參數的數據類型必須與第一個非空參數的數據類型一致。
select coalesce(null,null,null,'a string') from dual;
select coalesce(null,null,null) from dual;
select coalesce(substr('abc',4),'not bc','no substring') from dual;
select coalesce(substr('abc',4),'not bc',123) from dual;--錯誤
DECODE函數通過測試前兩項的相等性來實現if-then-else條件邏輯,如果它們相等,則返回第三個參數,如果它們不相等,可能返回另一項。
DECODE函數至少使用三個強制參數,但可以使用更多參數。語法:DECODE(expr1,comp1,iftrue1[,comp2,iftrue2...[,compN,iftrueN]][,iffalse])。這些參數的計算如下面的偽代碼示例:
if expr1 = comp1 then return iftrue1
else if expr1 = comp2 then return iftrue 2
...
...
else if expr1 = compN then return iftrueN
else return null | iffalse;
DECODE 函數的所有參數都可以是表達式。返回的數據類型與第一個匹配比較選項的數據類型相同的。表達式expr1被隱式轉換為第一個比較參數comp1的數據類型。計算其他比較參數comp2...compn時,也會將它們隱式轉換為comp1相同的數據類型。DECODE 認為兩個空值相等,因此如果expr1是空值,并且comp3是出現的第一個空值比較參數,那么就會返回對應的結果參數iftrue3。
select decode(1234,123,'123 is a match') from dual;
select decode(1234,123,'123 is a match','No match') from dual;
select decode('search','comp1','true1','comp2','true2','search','true3',substr('2search',2,6),'true4','false') from dual;
select decode(null,'comp1','true1','comp2','true2',null,'true3','false') from dual;
select decode(1234,123,123,'No match') from dual; --‘No match'ORA-01722: invalid number
CASE表達式在所有第三和第四代編程語言都可以實現。和DECODE函數一樣,CASE表達式使用if-then-else條件邏輯。CASE表達式有兩個變體。簡單的CASE表達式列出條件搜索項一次,由每個比較表達式來測試與搜索項的相等性。搜索的CASE表達式列出每個比較表達式的單獨條件。
CASE表達式至少使用三個強制參數,但可以使用更多參數。其語法取決于是使用簡單CASE表達式還是使用搜索的CASE表達式。
簡單CASE表達式的語法:
CASE search_expr
WHEN comparison_expr1 THEN iftrue1
[WHEN comparison_expr2 THEN iftrue2
...
WHEN comparison_exprN THEN iftureN]
[ELSE iffalse]
END
簡單CASE表達式包含在CASE...END代碼塊內,由至少一個WHEN...THEN語句組成。在最簡單的情況下——只有一個WHEN...THEN語句,search_expr與comparison_expr1進行比較。如果它們相等,姥返回結果iftrue1。如果不相等,那么返回一個空值,除非定義了ELSE組件,這個情況返回默認的iffalse值。當CASE表達式中有多個WHEN...THEN語句時,就會不斷搜索匹配的比較表達式,直到找到匹配項為止。
搜索、比較和結果參數可以是列值、表達式或都字面值,但必須都是相同數據類型。
select
case substr(1234,1,3)
when '134' then '1234 is a match'
when '1235' then '1235 is a match'
when concat('1','23') then concat('1','23')|| ' is a match'
else 'no match'
end
from dual;
搜索的CASE表達式的語法:
CASE
WHEN condition1 THEN iftrue1
[WHEN condition2 THEN iftrue2
...
WHEN conditionN THEN iftrueN]
[ELSE iffalse]
END
搜索的CASE表達式包含在CASE...END代碼塊內,由至少一個WHEN...THEN語句組成。在最簡單的情況下——只有一個WHEN...THEN語句,計算condition1;如果它是true,那么返回結果iftrue1。如果不是,那么就返回一個空值,除非定義了ELSE組件,這種情況下,返回默認的iffalse值。當CASE表達式中有多個WHEN...THEN語句時,就會不斷搜索匹配的比較表達式,直到找到匹配項為止。
select
case
when length(substr(1234,1,3)) = 1 then 'length of substring is 1'
when length(substr(1234,1,3)) = 2 then 'length of substring is 2'
when length(substr(1234,1,3)) = 3 then 'length of substring is 3'
else 'no match'
end
from dual;
以上是“Oracle常用函數有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。