字符函數
函數 | 說明 |
---|---|
ascii(x) | 返回x的ascii值 select ascii('a') from dual; -- 97 |
concat(x,y) | 返回x和y的拼接字符串 select concat('a','b') from dual; -- ab |
instr(strObj,strSearch[,start[,n]]) | 在strObj中查找strSearch內容,從start位置開始找起,返回第n個結果的索引,start和n默認為1,可以不指定 select instr(‘a1a2a3a4’,‘a’) from dual; -- 1 索引從1開始 select instr(‘a1a2a3a4’,‘a’,2) from dual; -- 從索引2開始找a,結果是3 select instr(‘a1a2a3a4’,‘a’,2,2) from dual; -- 從索引2開始返回第二個結果,索引為5 |
length(x) | x的長度 select length('abc') from dual; -- 3 |
lower(x) | x的小寫形式 select lower(‘aBcD’) from dual; -- abcd |
upper(x) | x的大寫形式 select upper(‘aBcD’) from dual; -- ABCD |
ltrim(x[,str]) | 去掉左邊的字符串,默認是空格 select length(ltrim(’ abc’)) from dual; -- 3,因為結果是’abc’去掉了左邊的空格 select length(ltrim(’***abc’,’*’)) from dual; –- 去掉字符串中的* 結果為3 |
rtrim(x[,str]) | 類似於ltrim,該函數是去掉右邊的字符 |
trim(x[,str]) | 去掉左右兩邊的字符 |
replace(strObj,old,new) | 替換字符中的old為new select replace(‘a1a1a1’,‘1’,‘a’) from dual; -- aaaaaa |
substr(strObj,star[,length]) | 從strObj中截取字符串,star是開始位置,length可以省略,默認從star位置截取到strObj最后 select substr(‘abcdefg’,2) from dual; -- bcdefg select substr(‘abcdefg’,2,4) from dual; -- bcde |
regexp_substr(strObj,'[^,]+',star,number) | 從strObj中截取字符串,'[^,]+'是正則表達式,此處表示匹配除了逗號至少出現一次的字符,star是開始位置,number是第幾個字段 select regexp_substr('7788,5566,8899','[^,]+',1,1) from dual; -- 7788 select regexp_substr('7788,5566,8899','[^,]+',1,2) from dual; -- 5566 |
數字函數
函數 | 說明 |
---|---|
sign(x) | 判斷x是正數還是負數,正數返回1,負數返回0 select sign(-1) from dual; -- 0select sign(3) from dual; -- 1 |
abs(x) | 取x的絕對值 select abs(-1) from dual; -- 1 |
ceil(x) | 大於或等於x的最小值 select ceil(1.1) from dual; -- 2 select ceil(-1.9) from dual; -- -1 |
floor(x) | 返回小於或等於x的最大值 select floor(1.9) from dual; -- 1 select floor(-1.1) from dual; -- -2 |
round(x[,y]) | 在y位上四舍五入,y可以省略,默認取值並四舍五入 select round(3.45),round(3.51),round(3.4444,2),round(3.5555,2) from dual; -- 3,4,3.44,3.56 |
trunc(x[,y]) | 在y位上截斷,y省略的話是取整,不會四舍五入,只是簡單截斷 |
mod(x,y) | 求x除以y的余數 select mod(5,2) from dual; -- 1 |
日期函數
對日期或時間的處理,sysdate在Oracle中是當前時間的關鍵字
函數 | 說明 |
---|---|
add_months(date,n) | 在date參數上增加一個n的月 select sysdate,add_months(sysdate,1) from dual; -- 2021/1/23 16:41:47 , 2021/2/23 16:41:47 |
last_day(date) | 返回data參數所在月的最后一天的日期 select last_day(sysdate) from dual; -- 2021/1/31 16:47:32 |
round(date[,fmt]) | 返回四舍五入的日期,fmt默認是’DDD’,月中的某一天,fmt取值可以是’YEAR’,‘MONTH’,‘DDD’,'DAY’ select sysdate,round(sysdate),round(sysdate,'year'),round(sysdate,'month'),round(sysdate,'day') from dual; -- 2021/1/23 16:48:48 , 2021/1/24 , 2021/1/1 , 2021/2/1 , 2021/1/24 |
months_between(d1,d2) | d1和d2之間的月份差 select months_between(sysdate,add_months(sysdate,2)) from dual; -- -2 |
next_day(date,'星期一') | 指定日期后的下一個星期一(也可以是星期二等等) select next_day(sysdate,'星期一') from dual; -- 2021/1/25 16:51:39 |
extract(month from date) | 從指定日期中提取月份 select extract(month from sysdate) from dual; -- 12 month還可以是day,year提取日期和年 |
trunc(date,fmt) | 截斷日期fmt,fmt可以是month/year,相當於只要月或年的信息 select trunc(sysdate,‘month’) from dual; --2021/1/1日期信息沒有了,只保留到月,年也類似。 |
轉換函數
函數 | 說明 |
---|---|
to_date(datastr,fmt) | 把字符串形式的日期信息按照fmt格式進行轉換 select to_date('2020-12-20 15:33:44','yyyy-mm-dd hh24:mi:ss') from dual; |
to_char(dataobj,fmt) | 把日期對象顯示為fmt指定的日期格式,還可以把數字轉換為字符串形式 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; |
to_number(numberStr,fmt) | 把字符形式的數字按照一定的格式轉換為數字 select to_number('00123') from dual; -- 123 select to_number('12345.678', '99999.999') from dual; -- 12345.678,參數1和2要對應,參數2可以比參數1位數多,但不能反過來 |
統計函數
在分組的情況下使用
函數 | 說明 |
---|---|
sum | 求和函數 |
count | 統計數據數目 |
avg | 求平均值 |
max | 求最大值 |
min | 求最小值 |
nvl和nvl2函數
在上表中,如果要加sal+comm列時,comm有的列為null,不能參與運算,會使原有的sal都顯示不出來:
此時可以使用nvl函數,nvl函數可以把一列中值為null的值變成想要的值來進行運算:
SELECT sal,comm,sal+NVL(comm,0) FROM emp;
nvl(col,value):當col為null時,返回value的值
nvl2(expr1,expr2,expr3):如果expr1值為null,返回expr3的值,如果expr1值不為null,則返回expr2的值
select nvl2(null,1,0),nvl2('abc',1,0) from dual; -- 0 1
decode函數
decode(條件,值1,返回值1,值2,返回值2,....,值n,返回值n,缺省值):這個函數有switch和if的特征
行轉列
decode函數配置統計函數可以實現行轉列的效果,下面有表:
姓名 | 科目 | 成績 |
---|---|---|
趙一 | Java | 100 |
趙一 | C | 90 |
趙一 | C++ | 95 |
錢二 | Java | 90 |
錢二 | C | 100 |
錢二 | C++ | 99 |
想要把這個表中的數據轉換為下面的格式:
姓名 | Java | C | C++ |
---|---|---|---|
趙一 | 100 | 90 | 95 |
錢二 | 90 | 100 | 99 |
首先使用decode函數:
-- ++是特殊字符用2代替了++
SELECT 姓名,
DECODE(科目, 'Java', 成績) JAVA,
DECODE(科目, 'C', 成績) C,
DECODE(科目, 'C++', 成績) C2
FROM 成績表 GROUP BY 姓名 ;
姓名 | Java | C | C2 |
---|---|---|---|
趙一 | 100 | ||
趙一 | 90 | ||
趙一 | 95 | ||
錢二 | 90 | ||
錢二 | 100 | ||
錢二 | 99 |
使用decode函數后變為上表,解決方法:使用分組和sum函數,將姓名一樣的數據合為一條:
SELECT 姓名,
SUM(DECODE(科目, 'Java', 成績)) JAVA,
SUM(DECODE(科目, 'C', 成績)) C,
SUM(DECODE(科目, 'C++', 成績)) C2
FROM 成績表 GROUP BY 姓名 ;