您好,登錄后才能下訂單哦!
數據類型轉換分為:
隱式數據類型轉換
顯示數據類型轉換
隱式數據類型轉換:
在表達式中,Oracle服務器自動完成下列轉換
From | To |
VARCHAR2 or CHAR | NUMBER |
VARCHAR2 or CHAR | DATE |
NUMBER | VARCHAR2 or CHAR |
DATE | VARCHAR2 or CHAR |
顯示數據類型轉換
1、使用 TO_CHAR 函數對日期的轉換
格式:TO_CHAR (date, 'format_model')
必須包含在單引號中
大小寫敏感。
可以包含任意的有效的日期格式。
可以使用 fm 去掉多余的空格或者前導零。
與日期值用逗號隔開。
日期格式的組成
元素 | 結果 |
YYYY | 完整的年份 |
YEAR | 年(英文) |
MM | 雙位數字月份 |
MONTH | 完整的月份名稱 |
MON | 月份的三個字母縮寫 |
DY | 星期的三個字母的縮寫 |
DAY | 完整的星期名稱 |
DD | 月份的數字天 |
1、查找員工入職日期,并按照 日 月 年方式顯示
select last_name,to_char(hire_date,'fmDD Month YYYY') as hiredate from employees;
2、查詢員工入職日期,按照英文的星期、月份、英文年數
select last_name,to_char(hire_date,'fmDAY Month YEAR') as hiredate from employees;
3、查詢員工入職日期,按照數字 日、月、年方式
select last_name,to_char(hire_date,'fmDD MM YYYY') as hiredate from employees;
4、查詢員工入職日期,按照年、月、日方式
select last_name,to_char(hire_date,'YYYY,MM,fmDD') as hiredate from employees;
5、創建一張報表,現在員工入職日期當天為周六,并顯示FIRST_NAME和LAST_NAME列的信息和一個表達式,這個表達式的別名為START_DATE。
select first_name,last_name,to_char(hire_date,'fmDAY Month YYYY') start_date from employees where to_char(hire_date,'fmDAY')='SATURDAY';
也可以這樣顯示
select first_name,last_name,to_char(hire_date,'fmDAY,"the "ddth "of" Month, Yyyysp.') start_date from employees where to_char(hire_date,'fmDAY')='SATURDAY';
使用 TO_CHAR 函數對數字的轉換
元素 | 結果 |
9 | 代表一個數字 |
0 | 強制顯示0 |
$ | 放置一個浮動的美元符號 |
L | 采用浮動本地貨幣符號 |
. | 打印小數點 |
, | 打印一個逗號作為千位標示符 |
1、查找名字為Ernst 員工的工資,并按$99,999.0的格式輸出
select salary,to_char(salary,'$99,999.00') salary from employees where last_name='Ernst';
2、查找名字為Zlotkey 員工的工資,并按照的$99,999.0的格式輸出
select salary,to_char(salary,'L0,0000.000') salary from employees where last_name='Zlotkey';
使用 TO_NUMBER 和 和 TO_DATE 函數
使用 TO_NUMBER 函數將字符轉換為數字格式:
TO_NUMBER(char[, 'format_model'])
使用 TO_DATE 函數將字符串轉換為日期格式:
TO_DATE(char[, 'format_model'])
這個函數有一個fx 修飾符, 這個修飾符指定TO_DATE 中字符參數和格式精確匹配.
使用RR日期格式,在員工表中查找1990年之前入職的員工,在1999年執行查詢或者現在執行,產生的結果是否相同
1、查找05年1月1號以后入職的員工
select last_name,to_char(hire_date,'DD-Mon-YYYY') from employees where hire_date > to_date('01-Jan-05','DD-Mon-RR');
嵌套函數
單行函數可以嵌套到任意層級
嵌套函數的執行順序是由內到外
1、查找60部門的員工last_name 并將名字變成大寫,與US拼接在一起
select last_name,upper(concat(substr(last_name,1,8),'_US')) con_last_name from employees where department_id=60;
通用函數:這些函數適用于任何數據類型,同時也適用于空值:
NVL (expr1, expr2) : 如果expr1位空,則返回expr2
NVL2 (expr1, expr2, expr3) : 如果參數表達式expr1值為NULL,則NVL2()函數返回參數表達式expr3的值;如果參數表達式expr1值不為NULL,則NVL2()函數返回參數表達式expr2的值。
NULLIF (expr1, expr2) : 如果兩個指定的表達式相等,則返回空值。不相等返回expr1
COALESCE (expr1, expr2, ..., exprn):依次參考各參數表達式,遇到非null值即停止并返回該值。如果所有的表達式都是空值,最終將返回一個空值
NVL 函數
將空值轉換成一個已知的值:
可以使用的數據類型有數字、日期、字符。
數據類型必須匹配:
– NVL(commission_pct,0)
– NVL(hire_date,'01-JAN-97')
– NVL(job_id,'No Job Yet')
1、計算員工年薪,按照last_name, 提成,和12*salary 顯示
select last_name,salary,nvl(commission_pct,0) comm,(salary*12) +(salary*12*NVL(commission_pct,0)) AN_SAL from employees;
2、查詢50和80部門員工的工資并現在三段字符如果commission_pct 為空就顯示SAL,如果不為空就顯示SAL+COMM
select last_name,salary,commission_pct, nvl2(commission_pct, 'SAL+COMM', 'SAL') income from employees where department_id in (50,60);
3、查找既沒有提成也沒有領導id的員工,按照last_name、employee_id顯示
select last_name,employee_id,coalesce(to_char(commission_pct),to_char(manager_id),'No commission and no manager') from employees;
4、創建一張報表,要求檢索EMPLOYEES表中DEPARTMENT_ID為100的行集合。這個集合包含
FIRST_NAME和LAST_NAME,以及別名為NAME_LENGTHS的表達式。如果FIRST_NAME和
LAST_NAME長度不相等,該表達式返回字符串‘Different Length’,否則返回字符串為‘Same
Length’
select last_name,first_name,nvl2(nullif(length(last_name),length(first_name)),'Different Length','Same Length') name_lengths from employees where department_id=100;
條件表達式
在 SQL語句中使用 IF-THEN-ELSE 邏輯。
使用兩種方法:
– CASE 表達式
– DECODE 函數
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
使用case表達式,實現IF-THEN-ELSE 的示例:
1、把job_id 為it_prog、st_clerk、sa_rep等職位的員工分別按照1.1/1.15/1.2的比例漲工資,除了這3個部門以外的職位都按照正常的顯示。
select last_name, job_id, salary,
case job_id when 'it_prog' then 1.10*salary
when 'st_clerk' then 1.15*salary
when 'sa_rep' then 1.20*salary
else salary end "revised_salary"
from employees;
LAST_NAME JOB_ID SALARY revised_salary
------------------------- ---------- ---------- --------------
OConnell SH_CLERK 2600 2600
Grant SH_CLERK 2600 2600
Whalen AD_ASST 4400 4400
Hartstein MK_MAN 13000 13000
Fay MK_REP 6000 6000
Mavris HR_REP 6500 6500
Baer PR_REP 10000 10000
Higgins AC_MGR 12008 12008
Gietz AC_ACCOUNT 8300 8300
King AD_PRES 24000 24000
Kochhar AD_VP 17000 17000
De Haan AD_VP 17000 17000
Hunold IT_PROG 9000 9000
Ernst IT_PROG 6000 6000
Austin IT_PROG 4800 4800
Pataballa IT_PROG 4800 4800
Lorentz IT_PROG 4200 4200
Greenberg FI_MGR 12008 12008
Faviet FI_ACCOUNT 9000 9000
Chen FI_ACCOUNT 8200 8200
Sciarra FI_ACCOUNT 7700 7700
Urman FI_ACCOUNT 7800 7800
Popp FI_ACCOUNT 6900 6900
Raphaely PU_MAN 11000 11000
Khoo PU_CLERK 3100 3100
Baida PU_CLERK 2900 2900
Tobias PU_CLERK 2800 2800
Himuro PU_CLERK 2600 2600
Colmenares PU_CLERK 2500 2500
Weiss ST_MAN 8000 8000
Fripp ST_MAN 8200 8200
Kaufling ST_MAN 7900 7900
Vollman ST_MAN 6500 6500
Mourgos ST_MAN 5800 5800
Nayer ST_CLERK 3200 3200
Mikkilineni ST_CLERK 2700 2700
Landry ST_CLERK 2400 2400
Markle ST_CLERK 2200 2200
Bissot ST_CLERK 3300 3300
Atkinson ST_CLERK 2800 2800
Marlow ST_CLERK 2500 2500
Olson ST_CLERK 2100 2100
Mallin ST_CLERK 3300 3300
Rogers ST_CLERK 2900 2900
Gee ST_CLERK 2400 2400
Philtanker ST_CLERK 2200 2200
Ladwig ST_CLERK 3600 3600
Stiles ST_CLERK 3200 3200
Seo ST_CLERK 2700 2700
Patel ST_CLERK 2500 2500
Rajs ST_CLERK 3500 3500
Davies ST_CLERK 3100 3100
Matos ST_CLERK 2600 2600
Vargas ST_CLERK 2500 2500
Russell SA_MAN 14000 14000
Partners SA_MAN 13500 13500
Errazuriz SA_MAN 12000 12000
Cambrault SA_MAN 11000 11000
Zlotkey SA_MAN 10500 10500
Tucker SA_REP 10000 10000
Bernstein SA_REP 9500 9500
Hall SA_REP 9000 9000
Olsen SA_REP 8000 8000
Cambrault SA_REP 7500 7500
Tuvault SA_REP 7000 7000
King SA_REP 10000 10000
Sully SA_REP 9500 9500
McEwen SA_REP 9000 9000
Smith SA_REP 8000 8000
Doran SA_REP 7500 7500
Sewall SA_REP 7000 7000
Vishney SA_REP 10500 10500
Greene SA_REP 9500 9500
Marvins SA_REP 7200 7200
Lee SA_REP 6800 6800
Ande SA_REP 6400 6400
Banda SA_REP 6200 6200
Ozer SA_REP 11500 11500
Bloom SA_REP 10000 10000
Fox SA_REP 9600 9600
Smith SA_REP 7400 7400
Bates SA_REP 7300 7300
Kumar SA_REP 6100 6100
Abel SA_REP 11000 11000
Hutton SA_REP 8800 8800
Taylor SA_REP 8600 8600
Livingston SA_REP 8400 8400
Grant SA_REP 7000 7000
Johnson SA_REP 6200 6200
Taylor SH_CLERK 3200 3200
Fleaur SH_CLERK 3100 3100
Sullivan SH_CLERK 2500 2500
Geoni SH_CLERK 2800 2800
Sarchand SH_CLERK 4200 4200
Bull SH_CLERK 4100 4100
Dellinger SH_CLERK 3400 3400
Cabrio SH_CLERK 3000 3000
Chung SH_CLERK 3800 3800
Dilly SH_CLERK 3600 3600
Gates SH_CLERK 2900 2900
Perkins SH_CLERK 2500 2500
Bell SH_CLERK 4000 4000
Everett SH_CLERK 3900 3900
McCain SH_CLERK 3200 3200
Jones SH_CLERK 2800 2800
Walsh SH_CLERK 3100 3100
Feeney SH_CLERK 3000 3000
107 rows selected.
DECODE 函數
在需要使用 IF-THEN-ELSE 邏輯時:
DECODE(col|expression, search2, result1
[, search3, result2,...,]
[, default])
同上面的例子一樣還是it_prog、st_clerk、sa_rep 三個職位的員工相應的漲錢,其它職位按照默認計算
select last_name, job_id, salary,
decode(job_id, 'it_prog', 1.10*salary,
'st_clerk', 1.15*salary,
'sa_rep', 1.20*salary,
salary)
revised_salary
from employees;
LAST_NAME JOB_ID SALARY REVISED_SALARY
------------------------- ---------- ---------- --------------
OConnell SH_CLERK 2600 2600
Grant SH_CLERK 2600 2600
Whalen AD_ASST 4400 4400
Hartstein MK_MAN 13000 13000
Fay MK_REP 6000 6000
Mavris HR_REP 6500 6500
Baer PR_REP 10000 10000
Higgins AC_MGR 12008 12008
Gietz AC_ACCOUNT 8300 8300
King AD_PRES 24000 24000
Kochhar AD_VP 17000 17000
De Haan AD_VP 17000 17000
Hunold IT_PROG 9000 9000
Ernst IT_PROG 6000 6000
Austin IT_PROG 4800 4800
Pataballa IT_PROG 4800 4800
Lorentz IT_PROG 4200 4200
Greenberg FI_MGR 12008 12008
Faviet FI_ACCOUNT 9000 9000
Chen FI_ACCOUNT 8200 8200
Sciarra FI_ACCOUNT 7700 7700
Urman FI_ACCOUNT 7800 7800
Popp FI_ACCOUNT 6900 6900
Raphaely PU_MAN 11000 11000
Khoo PU_CLERK 3100 3100
Baida PU_CLERK 2900 2900
Tobias PU_CLERK 2800 2800
Himuro PU_CLERK 2600 2600
Colmenares PU_CLERK 2500 2500
Weiss ST_MAN 8000 8000
Fripp ST_MAN 8200 8200
Kaufling ST_MAN 7900 7900
Vollman ST_MAN 6500 6500
Mourgos ST_MAN 5800 5800
Nayer ST_CLERK 3200 3200
Mikkilineni ST_CLERK 2700 2700
Landry ST_CLERK 2400 2400
Markle ST_CLERK 2200 2200
Bissot ST_CLERK 3300 3300
Atkinson ST_CLERK 2800 2800
Marlow ST_CLERK 2500 2500
Olson ST_CLERK 2100 2100
Mallin ST_CLERK 3300 3300
Rogers ST_CLERK 2900 2900
Gee ST_CLERK 2400 2400
Philtanker ST_CLERK 2200 2200
Ladwig ST_CLERK 3600 3600
Stiles ST_CLERK 3200 3200
Seo ST_CLERK 2700 2700
Patel ST_CLERK 2500 2500
Rajs ST_CLERK 3500 3500
Davies ST_CLERK 3100 3100
Matos ST_CLERK 2600 2600
Vargas ST_CLERK 2500 2500
Russell SA_MAN 14000 14000
Partners SA_MAN 13500 13500
Errazuriz SA_MAN 12000 12000
Cambrault SA_MAN 11000 11000
Zlotkey SA_MAN 10500 10500
Tucker SA_REP 10000 10000
Bernstein SA_REP 9500 9500
Hall SA_REP 9000 9000
Olsen SA_REP 8000 8000
Cambrault SA_REP 7500 7500
Tuvault SA_REP 7000 7000
King SA_REP 10000 10000
Sully SA_REP 9500 9500
McEwen SA_REP 9000 9000
Smith SA_REP 8000 8000
Doran SA_REP 7500 7500
Sewall SA_REP 7000 7000
Vishney SA_REP 10500 10500
Greene SA_REP 9500 9500
Marvins SA_REP 7200 7200
Lee SA_REP 6800 6800
Ande SA_REP 6400 6400
Banda SA_REP 6200 6200
Ozer SA_REP 11500 11500
Bloom SA_REP 10000 10000
Fox SA_REP 9600 9600
Smith SA_REP 7400 7400
Bates SA_REP 7300 7300
Kumar SA_REP 6100 6100
Abel SA_REP 11000 11000
Hutton SA_REP 8800 8800
Taylor SA_REP 8600 8600
Livingston SA_REP 8400 8400
Grant SA_REP 7000 7000
Johnson SA_REP 6200 6200
Taylor SH_CLERK 3200 3200
Fleaur SH_CLERK 3100 3100
Sullivan SH_CLERK 2500 2500
Geoni SH_CLERK 2800 2800
Sarchand SH_CLERK 4200 4200
Bull SH_CLERK 4100 4100
Dellinger SH_CLERK 3400 3400
Cabrio SH_CLERK 3000 3000
Chung SH_CLERK 3800 3800
Dilly SH_CLERK 3600 3600
Gates SH_CLERK 2900 2900
Perkins SH_CLERK 2500 2500
Bell SH_CLERK 4000 4000
Everett SH_CLERK 3900 3900
McCain SH_CLERK 3200 3200
Jones SH_CLERK 2800 2800
Walsh SH_CLERK 3100 3100
Feeney SH_CLERK 3000 3000
107 rows selected.
2、顯示部門為80的每一位員工,適用的稅率為:
表示如果截取之為0稅率為0,1稅率為0.09 2稅率為0.2 后面以此類推
select last_name, salary,
decode (trunc(salary/2000, 0),
0, 0.00,
1, 0.09,
2, 0.20,
3, 0.30,
4, 0.40,
5, 0.42,
6, 0.44,
0.45) tax_rate
from employees
where department_id = 80;
LAST_NAME SALARY TAX_RATE
------------------------- ---------- ----------
Russell 14000 .45
Partners 13500 .44
Errazuriz 12000 .44
Cambrault 11000 .42
Zlotkey 10500 .42
Tucker 10000 .42
Bernstein9500 .4
Hall9000 .4
Olsen8000 .4
Cambrault7500 .3
Tuvault 7000 .3
King 10000 .42
Sully9500 .4
McEwen9000 .4
Smith8000 .4
Doran7500 .3
Sewall7000 .3
Vishney 10500 .42
Greene9500 .4
Marvins 7200 .3
Lee6800 .3
Ande6400 .3
Banda6200 .3
Ozer 11500 .42
Bloom 10000 .42
Fox9600 .4
Smith7400 .3
Bates7300 .3
Kumar6100 .3
Abel 11000 .42
Hutton8800 .4
Taylor8600 .4
Livingston8400 .4
Johnson 6200 .3
34 rows selected.
3、查詢LOCALTIONS表中的行,這些行的COUNTRY_ID列的值為US,請使用別名為LOCALTION_INFO
的表達式來計算STATE_PROVINCE列值,并返回不同的信息。結果如下圖:
STATE_PROVINCE | 返回值 |
Washington | 字符串’Headquarters’ |
Texas | 字符串’Oil Wells’ |
California | CITY值 |
New Jersey | STREET _ADDRESS列值 |
select decode(state_province,'Washington','Headquarters','Texas','Oil Wells','California',city,'New Jersey',
street_address) location_info,state_province,city,street_address,country_id from locations where country_id='US';
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。