三、單行函數(Single function)
3.1 字符函數(Character function)
3.1.1 大小寫轉換函數(Case-manipulation functions)
Lower("ABCdef") --> abcdef
UPPER("ABCdef") --> ABCDEF
INITCAP(abc def) --> Abc Def
示例:
Oracle數據庫中的數據是大小寫敏感的,student變表的name字段有一個值是XIAOMING,我們去查:select * from student where name = ‘xiaoming’;查不出數據,我們應該把name這一列全部轉化爲小寫再去匹配’xiaoming’:
select * from student where Lower(name) = ‘xiaoming’;
3.1.2 字符串轉換函數(Character-manipulation functions)
Concat("hello","World") --> helloWorld
Substr("helloworld",1,5) --> hello --從第1位開始截取5位
Substr("helloworld",6) -->world --從第6位截到最後
Length("helloworld") --> 10
Instr("helloworld","w") --> 6 --在第一個參數中第幾位
Lpad('12345',10,"*") --> *****12345 --向左用*補齊到10位
Rpad('12345',10,"*") -->12345*****
Trim('h' from 'helloworld') -->elloworld
Trim('helloworld') -->去掉字符串前後的空格
3.2 數字操作函數
round(123.234,2) -->123.23 --保留兩位(四捨五入)
trunc(123.234,2) -->123.23 --保留兩位(無四捨五入)
mod(1600,300) -->100 --求餘數
例外:
round(45.66,-1) –> 50 -1表示保留小數點前1位(四捨五入)
3.3日期操作函數
注意:
oracle中的日期格式是:DD-MMM-YY (01-SEP-95),在我們的數據庫中設置了默認的日期格式是oracle的話,在下面的函數中輸入該格式的字符串就會默認是一個Data類型,而輸入一個常用的’2017/09/08’就會被認爲是個字符串,後面有兩個函數解決這個問題。
實際開發中常用YYYY/MM/DD
months_between('01-SEP-95','11-JAN-94') --> 19.67741 1995年9月1日比1994你那1月11日大了19個月
add_months('11-JAN-94',6) -->11-Jul-94 加6個月
next_day('01-SEP-95','FRIDAY') -->下一個星期五
next_day('01-SEP-95',1) -->下一個周的第一天(週日)
last_day('01-SEP-95') -->這個月的最後一天
round('25-JUL-95','MONTH') -->1-Aug-95 把日期捨棄並四捨五入[95年8月25號-->95年9月1號]
round('25-JUL-95','YEAR') -->捨棄月份並四捨五入
trunc('25-JUL-25','MONTH')
trunc('25-JUL-25','YEAR') -->無四捨五入
補充round(sysdate,'yyyy') -->2018/1/1
3.3.1 關於日期類型的兩個轉換函數
(1)字符串轉日期
to_date(‘2016/07/01’,’yyyy/mm/dd’)
(2)日期類型轉字符串
to_char(sysdate,”yyyy/mm/dd hh:mi:ss”)
3.3.2 用我們常用的日期格式操作上面的函數
next_day('2017/09/08',1) ---> 報錯,原因見開頭注意
next_day(to_date('2017-09-08','YYYY-MM-DD'),1) -->正確。
也就是說,上面幾個函數第一個參數要接受一個Date,之所以上面寫的’01-SEP-95’這種不報錯是因爲數據庫設置了默認日期格式是oracle格式。
3.3.3 日期運算
日期是可以運算的,例如有一張表,包含了入職日期(hire_date)列,那我要算入職週數呢?
select (sysdate - hire_date)/7 as weeks from emp;
結果:
—————————
| WEEKS(SYSDATE-HIRE_DATE) |
—————————
| 9 |
—————————
3.4 不同類型的數據轉換
3.4.1 隱式轉換(oracle自動轉換,不需要我們寫函數)
對於賦值語句:
varchar2/char –> number
varcgar2/char –> date
number –> varchar2
date –> varchar2
[需要注意的是,字符串和日期相互轉換時,只有符合oracle日期格式的才能裝換]
對於表達式比較操作:
varchar2/char –> number
varchar2/char –> date
[日期同上]
實例
select * from student where name = 123; –> 報錯
oracle不會把123轉換爲字符串類型,而是會把name中的字符串轉換成爲123這種數字類型,xiaoming123這種字符串轉換即報錯。
3.4.2 顯式轉換
to_number() -- varchar --> number
to_char() -- number/date --> varchar
to_date() -- varchar --> date
日期轉字符串
to_char(date , ‘formate’)
format:格式yyyy-mm-dd,可以不寫
數字轉字符串
to_char(number , ‘format’)
這裏也是可以通過format控制格式:
9 表示一個數字
0 強制顯示0
S 放一個$
L 放一個當前環境的幣種
. 顯示一個小數點
, 顯示一個千分位
實例:比如我們要顯示格式化的薪資
select salary , to_char(salary , ‘L99,999.00’) from employees;
結果: 6000.00 ¥6,000.00
字符串轉數字
to_number(char , ‘format’);
按格式轉,這樣例如’¥8900’這種字符串都可以直接轉成8900數字。
to_number(‘ 99999’);這樣纔不會報錯。
3.5 其他常用單行函數
nvl(ex1 , ex2) --> 如果ex1爲空,則返回ex2
nvl(ex1 ,ex2 , ex3) --> 如果ex1爲空,則返回ex3,不爲空,則返回ex2
nullif(ex1 , ex2) --> 如果ex1和ex2相等,則返回空,否則返回ex1;
coalesce(ex1,ex2,ex3.....,exn) --> 從ex1開始往後找,直到找到一個不爲空的,返回,結束。沒找到,返回NULL
3.6 條件表達式
3.6.1 CASE語句
根據不同的職位顯示不同的薪水
select emp_name , job_id , salary,
case job_id
when 'IT_PROG' then 1.1*salary
when 'ST_PROG' then 1.2*salary
else
salary
end "SHOW_SALARY" from emp;
結果:
----------------------------------
| EMP_NAME | SALARY | SHOW_SALARY |
----------------------------------
| zhao | 1000 | 1100 |
----------------------------------
3.6.2 decode語句
同上:
select emp_name , job_id , salary,
decode(job_id,
'IT_PROG' ,
1.1*salary ,
'SG_PROG' ,
1.2*salary ,
salary
) show_salary from emp;