溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

發(fā)布時間:2020-07-01 08:18:08 來源:網(wǎng)絡(luò) 閱讀:636 作者:yuri_cto 欄目:數(shù)據(jù)庫

數(shù)據(jù)類型轉(zhuǎn)換分為:

  • 隱式數(shù)據(jù)類型轉(zhuǎn)換

  • 顯示數(shù)據(jù)類型轉(zhuǎn)換


隱式數(shù)據(jù)類型轉(zhuǎn)換:

在表達(dá)式中,Oracle服務(wù)器自動完成下列轉(zhuǎn)換

FromTo 
VARCHAR2 or CHARNUMBER
VARCHAR2 or CHARDATE 
NUMBERVARCHAR2 or CHAR
DATEVARCHAR2 or CHAR


顯示數(shù)據(jù)類型轉(zhuǎn)換

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

1、使用 TO_CHAR  函數(shù)對日期的轉(zhuǎn)換

格式:TO_CHAR (date, 'format_model')

  • 必須包含在單引號中

  • 大小寫敏感。

  • 可以包含任意的有效的日期格式。

  • 可以使用 fm 去掉多余的空格或者前導(dǎo)零。

  • 與日期值用逗號隔開。


日期格式的組成

元素結(jié)果
YYYY完整的年份
YEAR年(英文) 
MM雙位數(shù)字月份 
MONTH完整的月份名稱
MON月份的三個字母縮寫
DY星期的三個字母的縮寫
DAY完整的星期名稱
DD月份的數(shù)字天

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

1、查找員工入職日期,并按照 日 月 年方式顯示

select last_name,to_char(hire_date,'fmDD Month YYYY') as hiredate from employees;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

2、查詢員工入職日期,按照英文的星期、月份、英文年數(shù)

select last_name,to_char(hire_date,'fmDAY Month YEAR') as hiredate from employees;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

3、查詢員工入職日期,按照數(shù)字 日、月、年方式

select last_name,to_char(hire_date,'fmDD MM YYYY') as hiredate from employees;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

4、查詢員工入職日期,按照年、月、日方式

select last_name,to_char(hire_date,'YYYY,MM,fmDD') as hiredate from employees;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


5、創(chuàng)建一張報表,現(xiàn)在員工入職日期當(dāng)天為周六,并顯示FIRST_NAME和LAST_NAME列的信息和一個表達(dá)式,這個表達(dá)式的別名為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';

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


也可以這樣顯示

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';

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


使用 TO_CHAR 函數(shù)對數(shù)字的轉(zhuǎn)換

元素結(jié)果
9代表一個數(shù)字
0強制顯示0
$放置一個浮動的美元符號
L采用浮動本地貨幣符號
.打印小數(shù)點
,打印一個逗號作為千位標(biāo)示符


1、查找名字為Ernst 員工的工資,并按$99,999.0的格式輸出

select  salary,to_char(salary,'$99,999.00') salary from employees where last_name='Ernst';

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)



2、查找名字為Zlotkey 員工的工資,并按照的$99,999.0的格式輸出

select salary,to_char(salary,'L0,0000.000') salary from employees where last_name='Zlotkey';

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)



使用 TO_NUMBER 和 和 TO_DATE 函數(shù)


使用 TO_NUMBER 函數(shù)將字符轉(zhuǎn)換為數(shù)字格式:

TO_NUMBER(char[, 'format_model'])


使用 TO_DATE 函數(shù)將字符串轉(zhuǎn)換為日期格式:

TO_DATE(char[, 'format_model'])

這個函數(shù)有一個fx 修飾符, 這個修飾符指定TO_DATE 中字符參數(shù)和格式精確匹配.


使用RR日期格式,在員工表中查找1990年之前入職的員工,在1999年執(zhí)行查詢或者現(xiàn)在執(zhí)行,產(chǎn)生的結(jié)果是否相同


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');

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


嵌套函數(shù)

  • 單行函數(shù)可以嵌套到任意層級

  • 嵌套函數(shù)的執(zhí)行順序是由內(nèi)到外


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;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


通用函數(shù):這些函數(shù)適用于任何數(shù)據(jù)類型,同時也適用于空值:

NVL (expr1, expr2) : 如果expr1位空,則返回expr2

NVL2 (expr1, expr2, expr3) : 如果參數(shù)表達(dá)式expr1值為NULL,則NVL2()函數(shù)返回參數(shù)表達(dá)式expr3的值;如果參數(shù)表達(dá)式expr1值不為NULL,則NVL2()函數(shù)返回參數(shù)表達(dá)式expr2的值。

NULLIF (expr1, expr2) : 如果兩個指定的表達(dá)式相等,則返回空值。不相等返回expr1

COALESCE (expr1, expr2, ..., exprn):依次參考各參數(shù)表達(dá)式,遇到非null值即停止并返回該值。如果所有的表達(dá)式都是空值,最終將返回一個空值


NVL  函數(shù)

將空值轉(zhuǎn)換成一個已知的值:

可以使用的數(shù)據(jù)類型有數(shù)字、日期、字符。

數(shù)據(jù)類型必須匹配:

– 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;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


2、查詢50和80部門員工的工資并現(xiàn)在三段字符如果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);

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)


3、查找既沒有提成也沒有領(lǐng)導(dǎo)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;

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

4、創(chuàng)建一張報表,要求檢索EMPLOYEES表中DEPARTMENT_ID為100的行集合。這個集合包含

FIRST_NAME和LAST_NAME,以及別名為NAME_LENGTHS的表達(dá)式。如果FIRST_NAME和

LAST_NAME長度不相等,該表達(dá)式返回字符串‘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 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)




條件表達(dá)式

在 SQL語句中使用 IF-THEN-ELSE 邏輯。

使用兩種方法:

– CASE 表達(dá)式

– DECODE 函數(shù)


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表達(dá)式,實現(xiàn)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  函數(shù)

在需要使用 IF-THEN-ELSE 邏輯時:

DECODE(col|expression, search2, result1

[, search3, result2,...,]

[, default])


同上面的例子一樣還是it_prog、st_clerk、sa_rep 三個職位的員工相應(yīng)的漲錢,其它職位按照默認(rèn)計算

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

的表達(dá)式來計算STATE_PROVINCE列值,并返回不同的信息。結(jié)果如下圖:

STATE_PROVINCE返回值
Washington字符串’Headquarters’
Texas 字符串’Oil Wells’
CaliforniaCITY值
New JerseySTREET _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';

SQL 基礎(chǔ)之轉(zhuǎn)換函數(shù)和條件表達(dá)式(八)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI