三、sql基礎:單行函數--【Oracle數據庫】

三、單行函數(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(‘8900, 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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章