SQL语言(6)
SQL語言(6)
1.to_number字符串到數字轉換
to_number(‘arg1’,’fmt’):將字符串轉換為數值型的格式;帶格式好樣式fmt。
Arg1:字符串格式;需要轉型的數據;
Fmt:轉換格式;
例
將\34,346.56轉換為數字類型;Select to_number(‘\34,346.56’,’L999,999.00’) from dual;2.to_date字符到日期轉換
to_date(‘arg1’,’fmt’):將字符串轉換為日期格式。帶格式化樣式fmt;
Arg1:字符串類型;需要轉換的數據;
Fmt:轉換格式;
例
將2019年3月9日11點30分轉換為date類型;
Select to_date(‘2019年3月9日 11點30分’,’yyyy”年”mm”月”dd”日” hh”點”mi”分”’) from dual;
3.函數嵌套
?單行函數能夠被嵌套任意層次;
?嵌套函數的計算是從最里層到最外層;
(以hr用戶中的employees為例)
例
顯示受雇日期6個月后的下一個星期五的日期。結果日期將應該是:星期,月,日,年。使用Next 6 Month Review作為列別名。結果按受雇日期排序;
Select to_char(next_day(add_months(hire_date,6),’金曜日’),’day,mm,dd,yyyy’) “next 6 Month Review” from employees order by hire_date;
4.通用函數
可用于任意數據類型,并且適用于空值;
?Nvl(expr1,expr2)
?Nvl2(expr1,expr2,expr3)
?Nullif(expr1,expr2)
?Coalesce(expr1,expr2,…,exprn)
5.Nvl(expr1,expr2)函數
轉換一個空值到一個實際的值。
Expr1,expr2:可用的數據類型可以是日期、字符和數字。兩個參數的數據類型必須匹 配。
Expr1:是包含控制的原值或者表達式;
Expr2:適用于轉換控制的目的值;
(以hr用戶中的employees為例)
例
一、計算所有員工的年薪,如果有傭金包含傭金;
Select last_name,salary,commission_pct,salary12+salary12*nvl(commission_pct,0) from employees;
二、計算雇員的年報酬,你需要用12乘以月薪,再加上年薪乘以傭金百分比。顯示雇 員的名字、薪水、傭金和計算完后的薪水,新的薪水列名為AN_SAL;
Select last_name,salary,commission_pct,salary12+salary12*nvl(commission,0) “AN_SAL” from employees;
6.Nvl2(expr1,expr2,expr3)
檢查第一個表達式,如果第一個表達式不為空,那么返回第二個表達式;如果第一個表 達式為空返回第三個表達式; Expr1:是可能包含空值的原值或表達式; Expr2:expr1非空時返回值; Expr3:expr1為空時返回值;(以hr用戶中的employees為例)
例
查詢雇員信息,如果有傭金的顯示SAL_COMM如果沒有傭金則顯示SAL;Select last_name,salary,commission_pct,nvl2(to_char(commission_pct),’SAL_COMM’,’SAL’) from employees;7.Nullif(expr1,expr2)
比較兩個表達式,如果相等,函數返回空,如果不相等,函數返回第一個表達式;第一 個表達式不能為空;
如果expr1于expr2不相等返回expr1;
(以hr用戶中的employees為例)
例
查詢雇員,顯示他們的first_name與長度,長度列命名為expr1。Last_name與長度,長 度命名為expr2;判斷他們的長度,如果長度相同返回空,否則返回first_name的長度, 判斷結果列命名為result;
Select first_name,length(first_name) expr1,last_name,length(last_name) expr2,nullif(length(first_name),length(last_name)) result from employees;
8.Coalesce(expr1,expr2,…,exprn)
返回列表中第一個非空表達式;
如果Expr1非空,返回該表達式;如果expr1為空返回expr2;如果前面的表達式都為 空返回exprn;
(以hr用戶中的employees為例)
例
查詢雇員表,如果有傭金,顯示傭金值。如果沒有傭金,顯示工資。如果工資與傭金都 沒有顯示10;
Select last_name,coalesce(commission_pct,salary,10) from employees;
9.條件表達式
在SQL語句中提供if-then-else 邏輯的使用
?Case 表達式;
?Decode 函數;
10.Case表達式
如果沒有when…then滿足條件,并且else子句存在,Oracle返回else_expr,否則返 回null。所有表達式必須是相同的數據類型;
(以hr用戶中的employees為例)
例
查詢雇員,顯示 last_name,job_id,salary 如果 JOB_ID 是 IT_PROG,薪水增加 10%;如 果JOB_ID 是 ST_CLERK,薪水增加 15%;如果 JOB_ID 是 SA_REP,薪水增加 20%。對 于所有其他的工作角色,不增加薪水。
?有else的情況
Select last_name,job_id,salary,case job_id WHEN ‘IT_PROG’ THEN salary1.1 WHEN ‘ST_CLERK’ THEN salary1.15 WHEN ‘SA_REP’ THEN salary1.2 else salary end from employees;
?沒有else的情況
Select last_name,job_id,salary,case job_id WHEN ‘IT_PROG’ THEN salary1.1 WHEN ‘ST_CLERK’ THEN salary1.15 WHEN ‘SA_REP’ THEN salary1.2 end from employees;
11.decode函數
在比較表達式和每個查詢值后,如果表達式與查找相同,返回結果。如果省略默認值, 當沒有查找值與表達式相匹配是返回空值;
(以hr用戶中的employees為例)
例
使用 DECODE 函數完成(顯示 last_name,job_id,salary 如果 JOB_ID 是 IT_PROG,薪水
增加 10%;如果 JOB_ID 是 ST_CLERK,薪水增加 15%;如果 JOB_ID 是 SA_REP,
薪水增加 20%。對于所有其他的工作角色,不增加薪水。)
?有末尾值的情況;
Select last_name,job_id,salary decode(job_id,’IT_PROG’,salary1,1,’ST_CLERK’,salary1.15,’SA_REP’,salary1,2,salary) from employees;
?沒有末尾值的情況;
Select last_name,job_id,salary decode(job_id,’IT_PROG’,salary1,1,’ST_CLERK’,salary1.15,’SA_REP’,salary1,2) from employees;
總結
- 上一篇: SQL语言(5)
- 下一篇: SQL语言之多表查询(oracle)