26
ORACLE 公司的專業認證是當今市場上公認價值最高,最具鑑別力的認 證。目前全球有超過 50 萬以上人已透過 Oracle Certification Program 取得專 業認證,成為職場新鮮人的首選認證,它具有以下三大優勢:一、更多的工作 機會,二、更高的薪資成長 ORACLE OCP 榮登最高年薪認證榜首,三、更 高的身價保證 ORACLE OCP 認證專家炙手可熱。一定要獲得 ORACLE 證有 3 個理由: 1. 透過培養全球熱門的技術才能,取得競爭優勢。 2. 透過不斷學習,創造機會並提升您的可信度。 3. 80% ORACLE 證照持有人表示,他們因為取得認證而得到升職、加 薪或其他有助於職涯發展的機會,請加入他們的行列。 ORACLE 認證項目中,OCEOracle Database Certified SQL Expert是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高 級別認證,也是成為顧問的通行證。要取得 OCE 證照,需通過 SQL Expert Exam,該項考試所需具備之知識技能內容包括:關連式及物件式資料庫之基 本觀念,運用 SQL SQL*Plus 指令以檢索、新增、更改、刪除資料庫資料及 製作報表,以及產生及維護資料庫物件與熟悉資料庫各種相關語法及功能等。 美商甲骨文股份有限公司為推廣資訊產業認證,台灣分公司從 2005 年起 推出 Oracle Academy 計畫,並對國內立案之各大專院校提出互助優惠方案, 協助校方提供學生就業準備,取得證照的健全機制,俾使甲骨文人才培育及認 證機制得以推廣以供應市場所需,並提供在校學生實惠的管道取得有價值的

證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

ORACLE 公司的專業認證是當今市場上公認價值最高,最具鑑別力的認

證。目前全球有超過 50 萬以上人已透過 Oracle Certification Program 取得專

業認證,成為職場新鮮人的首選認證,它具有以下三大優勢:一、更多的工作

機會,二、更高的薪資成長 ─ ORACLE OCP 榮登最高年薪認證榜首,三、更

高的身價保證 ─ ORACLE OCP 認證專家炙手可熱。一定要獲得 ORACLE 認

證有 3 個理由:

1. 透過培養全球熱門的技術才能,取得競爭優勢。

2. 透過不斷學習,創造機會並提升您的可信度。

3. 80% 的 ORACLE 證照持有人表示,他們因為取得認證而得到升職、加

薪或其他有助於職涯發展的機會,請加入他們的行列。

在 ORACLE 認證項目中,OCE(Oracle Database Certified SQL Expert)

是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

級別認證,也是成為顧問的通行證。要取得 OCE 證照,需通過 SQL Expert

Exam,該項考試所需具備之知識技能內容包括:關連式及物件式資料庫之基

本觀念,運用 SQL 及 SQL*Plus 指令以檢索、新增、更改、刪除資料庫資料及

製作報表,以及產生及維護資料庫物件與熟悉資料庫各種相關語法及功能等。

美商甲骨文股份有限公司為推廣資訊產業認證,台灣分公司從 2005 年起

推出 Oracle Academy 計畫,並對國內立案之各大專院校提出互助優惠方案,

協助校方提供學生就業準備,取得證照的健全機制,俾使甲骨文人才培育及認

證機制得以推廣以供應市場所需,並提供在校學生實惠的管道取得有價值的

Page 2: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

證照。本人與辜教授在 OAI 專案上合作多年,對於他多年來致力於推動學生

考取 ORACLE 資料庫認證,嘉惠學子深感佩服,他的著作「ORACLE 資料庫

學習實務」內容精湛,並融入 OCE 考試所需之知識與技能重點,對於有意學

習 ORACLE 資料庫並參加 ORACLE DATABAE OCE 認證考試之初學者是一大

福音,故樂為之序。

美商甲骨文股份有限公司台灣分公司 教育訓練部資深經理 陳盈珍 謹識

2015.1.20

Page 3: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

在網際網路暨資訊化世界中,資料庫是儲存與處理宛如天上繁星般眾多電

子化資料的必備工具,而資料庫管理系統(Database Management System,

縮寫:DBMS)是一套用來建立資料庫、控制資料庫分類資料、存取資料以及

管理資料庫而設計的電腦軟體系統。當前具有代表性的資料管理系統例如:

ORACEL、Microsoft SQL Server、MySQL 等等,其中 ORACLE 資料庫在眾多

資料庫品牌中是一個廣受企業及機關單位愛用的產品,其效能與操控性堪稱是

資料庫界中的雙 B。根據坊間人力銀行的調查指出,ORACLE 人才月薪行情平

均約在 48K 上下,這在 22K 起薪盛行的年代,學習 ORACLE 資料庫技術成為

自己的核心能力,作為日後求職能力的碁石,相對的可說是一項高價值比(C/V

值)的學習投資。

透過 SQL 來操控 ORACLE 資料庫系統是學習 ORACLE 資料庫技術的基

礎。緣此,本書針對大專校院資訊管理系,暨其他有開設資料庫管理系統實務

性課程的校、院、系大二或大三學生,規劃編撰適合一個學期學習使用之資料

庫管理系統實務性學習教材。全書以做中學精神貫穿各章節,配合必要之關聯

式資料庫理論,採用 ORACLE DATABSE 資料庫管理系統為實作對象,以實務

性操作當為學習主軸。書內每個章節均提供大量實務性例題,對於學習者有極

大之幫助。此外,書中亦融入 ORACLE DATABASE 專科高階 OCE 證照考試(考

試科目 1Z047)之內容重點做為學習標的,對於有意參加 ORACLE DATABASE

OCE 證照考試者亦極有助益。

本書係筆者利用課餘閒暇編撰,雖曾戮力以赴追求完善,然而疏漏繆誤或

在所難免,歡迎讀者與先進不吝指正。

辜輝趂 謹誌

2015 年 1 月於板橋

Page 4: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

使用轉換函數及 SQL 條件

表達式 Using the conversion functions and SQL condition expressions

SQL 語句在運算時,原則上是同型別的數據才能相互運算,而實際上

有可能數值、日期、字符等資料會同時出現在一個運算式內,在符合某些規

定的情形下,資料庫管理系統會自動轉換(稱為隱性轉換)運算式內數據的

型別以進行運算,而大部分的情形下,您必須使用轉換函數把資料類型予以

轉換(稱為顯性轉換)後才能正確地運算。此外,SQL 語句是無法對空值

欄位進行運算的,因此對含有空值的欄位,您需要使用特定的轉換函數將其

轉換成指定值後再加以運算。SQL內建的轉換函數包括:

1. 將數值資料轉換成數字字符或將日期資料轉換成字串之轉換函數

TO_CHAR( )。

2. 將數字字符資料轉換成數值之轉換函數 TO_NUMBER( )。

3. 將日期字符資料轉換成日期數據之轉換函數 TO_DATE( )。

4. 將欄位內容的空值轉換為指定值之空值轉換函數:NVL、NVL2、

NULLIF、COALESCE等。

Page 5: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-2 Chapter 5 使用轉換函數及 SQL 條件表達式

除了資料類型轉換函數以外,本章另一個重點在介紹 SELECT 語句中

的 IF..THEN..ELSE之邏輯結構:CASE與 DECODE等兩個子句。

學習目標

完成本章課程後,您應該能夠做到以下幾點:

1. 說明資料類型轉換的意義。

2. 描述資料類型轉換的方式。

3. 使用 TO_CHAR( )、TO_NUMBER( )、TO_DATE( ) 等轉換函數轉換資

料類型。

4. 使用 NVL( )、NVL2( )、NULLIF( )、COALESCE( ) 等一般空值轉換函

數將空值轉換成為一個指定值。

5. 使用 SELECT子句的 IF..THEN..ELSE結構:CASE與 DECODE。

本章 5.1 小節至 5.3 小節為核心學習項目,一定要學會,5.4 小節為進階學

習項目,請自行斟酌學習。

5.1 資料類型的隱性轉換

SQL 的資料類型轉換有隱性轉換(Implicit Conversion)和顯性轉換

(Explicit Conversion)兩種方式,如圖 5.1。隱性轉換指不必使用指定的轉

換函數,在執行 SQL 語句時,資料庫管理系統會自動將運算資料轉換成相

同的型別後再予以運算。反之,顯性轉換指須人為下達轉換函數指令來處

理資料類型轉換。

Page 6: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.1 資料類型的隱性轉換 5-3

圖 5.1 SQL 語句的資料類型轉換類別

ORACLE 資料庫會自動轉換的資料類型如表 5.1。在表 5.1 中,運算

式中的運算元(Operands)資料類型會依運算符的類型屬性,例如算術運

算符或字符運算符,來轉換成合適的資料類型再予以運算。

表 5.1 ORACLE 資料庫可自動轉換的資料類型

從 轉換至

VARCHAR2 或 CHAR NUMBER

VARCHAR2 或 CHAR DATE

NUMBER VARCHAR2 或 CHAR

DATE VARCHAR2 或 CHAR

例如:

SELECT 5+'10' FROM DUAL;

執行結果為數值 15。

說明:

因運算式的運算符為加(+),因此資料庫管理系統會自動把 '10' 這個字串轉換成數值 10 後再和另一個運算元 5 相加。

SELECT 5||'10' FROM DUAL;

執行結果為字串 '510'。

Page 7: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-4 Chapter 5 使用轉換函數及 SQL 條件表達式

說明:

因運算式的運算符為字串之串接(||),因此資料庫管理系統會自動把

5 這個數值轉換成字串 '5' 後再和另一個運算元 '10' 串接。

請注意,在表 5.1 中當系統要將 VARCHAR2 或 CHAR 自動轉換成

DATE 格式時,日期字串必須為 'DD MON YY' 之預設格式,否則便不會

執行隱性轉換。其中 DD 為 2 位數日期值,MON 為月分之 3 個英文字母縮

寫,大小寫均可,YY 為 YY 格式之西元年分後兩位數字。

例題 5.1.1

在 OE 帳戶 ORDERS 資料表,執行下列命令欲查詢 2001 年 6 月 30 日

以後下訂的訂單號碼和客戶號碼,請問錯誤何在?應如何修改?

SELECT order_id, customer_id FROM orders WHERE order_date > 'June 30 2001';

解析:

1. 在 WHERE 子句中,系統無法對預設格式 DD-MON- YY 以外之日

期字串自動轉換。因此上述命令執行時會出現如下錯誤訊息:

2. 此題由於日期字串非預設格式,因此需將字串改為預設格式 '30 JUN 01'。修改後之完整命令如下:

SELECT order_id, customer_id FROM orders WHERE order_date > '30 Jun 01';

Page 8: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.2 資料類型的顯性轉換 5-5

執行結果(部分):

5.2 資料類型的顯性轉換

一、SQL 內建的資料類型轉換函數

SQL 內建的資料類型轉換函數有 TO_NUMBER( )、TO_CHAR( )、和

TO_DATE( ) 等三個單列函數,其互動關係如圖 5.2。茲簡介如下:

圖 5.2 SQL 資料類型轉換函數的互動關係

1. TO_NUMBER ( char, [fmt], [nlsparams] )

功能:將一個數字轉換成由 fmt 格式指定的數值。

說明:nlsparams 參數用來指定日期顯示的語系,未指定則用連結

期(Session)預設的語系顯示。

2. TO_CHAR ( number | date, [fmt], [nlsparams] )

功能:將一個數值或日期資料,依指定格式 fmt 轉換成 VARCHAR2字串後顯示,以便於閱讀。

Page 9: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-6 Chapter 5 使用轉換函數及 SQL 條件表達式

說明:fmt 參數為轉換後之顯示格式模式字符。nlsparams 參數用來

指定日期顯示的語系,未指定則用連結期(Session)預設的語系

顯示。

3. TO_DATE (char, [fmt], [nlsparams])

功能:將一個字串轉換成 fmt 格式指定之日期。

說明:如果未指定 fmt 則預設格式為 DD-MON-YY。nlsparams 參數作用同上。

二、數值與數字互為轉換之應用

如前述,在 SQL 中使用 TO_NUMBER( ) 函數可將數字轉換成數值。

反之,最常的情況是我們會用 TO_CHAR( ) 函數將查詢的欄位數值轉換成

指定格式之數字顯示,以利於閱讀輸出結果。數值與數字互轉對應命令如

下,而常用的數值對數字轉換格式元素如表 5.2 所示。

數字轉換成數值:TO_NUMBER(char,['fromate_model'])

數值轉換成數字:TO_CHAR(number,['formate_model'])

表 5.2 數值對數字常用轉換格式元素彙整表

元素 結果

9 一個 9 代表顯示一個位數。

0 強制加上一個 0。

$ 加上一個浮動$號。

L 使用當地錢幣符號。

. 在指定位置加上小數點。

, 在指定位置加上撇號。

Page 10: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.2 資料類型的顯性轉換 5-7

例題 5.2.1

在 HR 帳戶的 employees 資料表中,請用由右而左三位數一撇,並在

薪水前面加上 '$' 號之格式,查詢員工的薪水。

解析:

1. 本例題關鍵在於將數值轉換成指定格式之數字。

2. 由於 HR 帳戶範本資料中,員工薪水最高為 5 位數,因此轉換字符

應為 '$99,999'。

3. SQL 語句:

SELECT employee_id, last_name, TO_CHAR(salary,'$99,999') FROM employees;

4. 執行結果(部分):

例題 5.2.2

在 OE 帳戶 product_information 資料表中,假設 list_price 值分別為

1123.90 與 11235.90,請問下述 SQL 命令的執行結果分別為何?

SELECT TO_CHAR(list_price,'$9,999') FROM product_information;

Page 11: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-8 Chapter 5 使用轉換函數及 SQL 條件表達式

解析:

1. TO_CHAR(list_price,'$9,999') 可將數值依指定格式轉為字符以便

顯示及閱讀。

2. 格式中一個 9 代表一位數,如格式位數如無小數,則小數以四捨五

入進位。因此第一筆資料 TO_CHAR(1123.90,'$9,999') 之輸出為:

$1,234

3. 如格式位數小於資料位數長度,則原有之位數會以#顯示。第二筆

資料 TO_CAHR(list_price,'$9,999') 因格式位數只有 $9,999 表以四

位整數,前面加上 $ 及三位數一撇,小數四捨五入格式顯示,而待

轉之數值為 11235.90,整數有 5 位,前面加上 $ 符號,及三位數

一撇之撇號,總共有 7 個位數(Digital),長度超出格式模式,故

輸出結果為 7 個 #:

#######

三、日期與字串互為轉換之應用

將查詢得到的日期欄位內容轉換為字串主要是為了增加輸出資料之可

讀性。反之,將運算式中代表日期的字串轉換成日期,則是為了要進行日

期之比較運算或算術運算。相關命令格式如下:

日期轉換為字串:TO_CHAR(date,'format_model')

字串轉換為日期:TO_DATE(char[,'format_model'])

上述命令中,轉換格式模式 format_model 的格式元素如表 5.3,其使

用規則如下:

1. 格式字符必須用單引號括起來。

2. 大小寫有別。例如:TO_CHAR(hire_date,'DD-MON-YY') 在顯示

時,月分之英文縮寫以大寫呈現,而 TO_CHAR(hire_date,'DD- mon-YY') 在顯示時,月分之英文縮寫以小寫呈現。

Page 12: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.2 資料類型的顯性轉換 5-9

3. 可包含表 5.3 中任何有效的日期元素,元素間須以分隔號隔開,例

如:空格、逗號 ','、連字號 '-'、反斜號 '/' 等。

4. 輸出的日期、月分等會自動以空格填補,而如果要去除系統填補的

空格,可在格式字符前面加上 fm 以移除填補空格或日期中的前導

0。

例如:TO_CHAR(hire_date,'fmDD-Mon-YYYY')

在顯示日期 01 至 09 時,只顯示 1 至 9,其前導 0 不被顯示。

表 5.3 日期格式字符彙整表

元素 結果

YYYY 以 4 位阿拉伯數字顯示年份

YEAR 以英文顯示年份

MM 以 2 位阿拉伯數字顯示月份

MONTH 顯示月份英文名稱

MON 以 3 個英文字簡寫顯示月份

DDD 或 DD 或 D 年、月或星期內的日期。

DY 以 3 個英文字縮寫顯示該日期為星期幾。例如 FRI、SAT、WED 等。

DAY 以英文顯示該日期為星期幾。例如 SATURDAY、FRIDAY等。

DD 以 2 位阿拉伯數字顯示日期。

SCC 或 CC 以 2 位數顯示世紀。

Q 顯示年度之季別。

RM 以羅馬數字顯示月份,例如 8 以 VIII 表示。

WW 或 W 年或月內的週。

IW 以 ISO 標準顯示日期所在之週為年度之第幾週(1-53)。

HH 或 HH12 或 HH24 HH:顯示日期資料中的時刻;HH12:以 12 小時制(1-12)顯

示時刻;HH24 以 24 小時制(0-23)顯示時刻。

Page 13: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-10 Chapter 5 使用轉換函數及 SQL 條件表達式

表 5.3 日期格式字符彙整表(續)

MI 顯示時刻中的分鐘。

SS 顯示時刻中的秒。

SSSSS 顯示過午夜後之秒數(0-86399)。

AM 或 A.M.或 PM 或 P.M. 在日期時刻中顯示子午線指標 AM 或 PM。

例題:

SELECT TO_CHAR(SYSDATE,'DD-Mon-YY HH24:MI:SS A.M.') FROM dual;

執行結果:31-Jul-14 12:18:50 P.M.

註:粗體字為常用之元素。

例題 5.2.3

在 OE 帳戶 orders 資料表中,請完成下述 WHERE 子句,以查詢在 2006 年 7 月 10 日以前下訂之訂單編號和客戶編號以及訂單日期。

SELECT order_id, customer_id, TO_CHAR( order_date, 'DD/MM/YYYY') FROM orders WHERE order_date< TO_DATE('JUL 10 2006', );

解析:

1. 因 TO_DATE 函數要轉換的日期字串為 'JUL 10 2006',所以配合

之轉換格式模式為 '月 日 年',即 'MON DD YYYY'。

2. 完整之 SQL 命令如下:

SELECT order_id, customer_id,TO_CHAR(order_date,'DD/MM/YYYY') FROM orders WHERE order_date < TO_DATE('JUL 10 2006','MON DD YYYY');

Page 14: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.3 空值轉換函數 5-11

3. 執行結果:

5.3 空值轉換函數

如 3.2 節所述,如果資料表欄位為空值(NULL Value),表示該欄位

的值可能為下列三種情況之一:(一)目前不知它的值(Unknown)或,

(二)未指派(Unassigned),或(三)沒有值(Unapplicable)。而不管

實際上是哪種狀況,在 SQL 運算式中,空值運算元相當於算術運算之無限

大,因此必須加以轉換後才可以處理。處理空值的單列轉換函數有

NVL( )、NVL2( )、NULLIF、COALESCE 等,分別介紹如下。

一、NVL 函數

SQL 語句格式:

NVL( expr1, expr2)

作用:

將 expr1 空值轉換成為一個指定的值 expr2。

說明:

1. expr1 為可能為空值之原始值或欄位,可為任意資料類型。

2. expr2 為空值轉換後之目標值。

Page 15: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-12 Chapter 5 使用轉換函數及 SQL 條件表達式

例題 5.3.1

NVL 使用示範。

1. NVL(commission_pct,0)

作用:如果 commission_pct 為空值,則傳回 0。

2. NVL(hire_date,'01-Jan-2014')

作用:如果 hire_date 為空值,則傳回'01-Jan-2014'。

例題 5.3.2

在 HR 帳戶 employees 資料表中,查詢並顯示員工的姓氐、薪水、紅

利百分比,並計算其年薪。

解析:

1. 年薪=月薪*(1+紅利百分比)*12。

2. 因只有績優員工享有紅利,無紅利員工之紅利百分比欄位

(commission_pct)為空值,此將導致年薪公式無法計算。因此需

用 NVL(commission_pct,0) 將無紅利員工的紅利值由空值轉為 0。

3. SQL 語句:

SELECT last_name , salary, NVL(commission_pct,0), salary*(1+NVL (commission_pct,0 ) ) *12 年薪

FROM employees;

4. 執行結果(部分):

Page 16: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.3 空值轉換函數 5-13

二、NVL2 函數

SQL 語句格式:

NVL2( expr1, expr2, expr3)

作用:

1. 如果 expr1≠ 空值,則返回 expr2。

2. 如果 expr1=空值,則返回 expr3。

說明:

1. expr1 為可能為空值之原始值或欄位,可為任意資料類型。

2. expr2 是 expr1 不是空值之轉換目標值。

3. expr3 是 expr1 為空值之轉換目標值。

例題 5.3.3

在 HR 帳戶 employees 資料表中,查詢部門 50 與部門 80 員工薪水及

紅利百分比,並計算其年薪(進階)。

解析:

1. 年薪=月薪*(1+紅利百分比)*12。

2. 因只有部分員工有紅利,因此紅利百分比可用 NVL2(commission_pct, commission_pct,0) 求得。

3. 要查詢部門 50 及部門 80 之條件式,可用 WHERE department_id IN (50,80) 達成。

4. SQL 語句:

SELECT last_name, salary, commission_pct, salary*(1+NVL2( commission_pct, commission_pct,0))*12 "年收入"

FROM employees WHERE department_id IN (50,80);

Page 17: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-14 Chapter 5 使用轉換函數及 SQL 條件表達式

5. 執行結果:

三、NULLIF 函數

SQL 語句格式:

NULLIF( expr1, expr2)

作用:

1.如果 expr1 = expr2,返回空值。

2.如果 expr1≠ expr2,返回 expr1。

說明:

expr1、expr2 為欲比較之原始值或欄位,可為任意資料類型。

例題 5.3.4

在 HR 帳戶 employees 資料表中,查詢並比對員工的姓氏與名字長度,

相同者,在比對結果中顯示 NULL。不等者,顯示名字字數(進階)。

解析:

1. 姓氏與名字字數之比對可用 NULLIF( ) 函數處理。

2. SQL 語句:

SELECT first_name, LENGTH( first_name) "名字字數", last_name, LENGTH( last_name) "姓氏字數", NULLIF (LENGTH(first_name), LENGTH(last_name)) 比對結果

FROM employees;

Page 18: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.3 空值轉換函數 5-15

3. 執行結果:

四、COALESCE 函數

SQL 語句格式:

COALESCE (expr1, expr2, expr3, …., expr n)

作用:

返回引數列中第一個非空值引數。

說明:

expr1 至 expr n 為欲比較之原始值或欄位,可為任意資料類型。

例題 5.3.5

在 HR 帳戶 employees 資料表中,查詢無上司且無紅利的員工,請在

此人資料中顯示 “這個人是老闆”。(進階)

解析:

1. 無上司者,其 manager_id 為空值。

2. 無紅利者,其 commission_pct 為空值。

3. 使用 coalesce 函數來依序返回不是空值之 commission_pct 及

manager_id。如二者均為空值,則返回 “這個人是老闆”。

Page 19: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-16 Chapter 5 使用轉換函數及 SQL 條件表達式

4. SQL 語句:

SELECT last_name,employee_id, COALESCE (TO_CHAR(commission_pct) , TO_CHAR( manager_id), '這個人是老闆')

FROM employees;

5. 執行結果(部分):

例題 5.3.6

配對下列函數及其功能。

1) NVL a) 評估第一個引數為 NOT NULL 或 NULL 值。

2) COALESCE b) 比較兩數式,如果相同,返回 NULL;否則僅

返回第一個數式。

3) NULLIF c) 返回引數列或數式中第一個非空值(Non-Null values)引數。

4) NVL2 d) 轉換 NULL 為確定值。

答:1D, 2C, 3B, 4A

5.4 SELECT 語句的若..則..否則..流程控制

SELECT 語句可以用 CASE 表達式或 DECODE 函數來達成和第三代

程式語言相似的「若..則..否則..」(IF..THEN..ELSE)的流程控制結構功

能,其 SQL 語法如下:

Page 20: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.4 SELECT 語句的若..則..否則..流程控制 5-17

一、CASE..WHEN..END 表述式

SQL 語句格式:

SELECT 欄位[ , ...] , CASE 表述式 WHEN 比較條件 1 THEN 返回值 1

[ WHEN 比較條件 2 THEN 返回值 2

WHEN 比較條件 N THEN 返回值 N

ELSE 預設返回值 ]

END FROM 表格

[WHERE..條件]

[ORDER BY 欄位]

作用:

在 SELECT 語句中,完成「若..則..否則」之條件動作。

說明:

1. CASE 前須加逗號。

2. CASE 後面的 expr 可為欄位或表述式。

3. 各個比較條件直接寫比較值,不可再寫比較欄位名稱。

4. 各個返回值可為欄位或表述式。

5. END 後面可以加上字串(用雙引號括住)當為 CASE..WHEN.. THEN..ELSE 之別名。

例題 5.4.1

在 HR 帳戶的 employees 資料表中,近年來由於公司獲利很好,決定

依下列條件加薪。請寫一 SQL 語句查詢員工編號、姓氏、職務、原薪水及

調整後之薪水。

1. 業務代表 SAL_REP 調薪 20%

2. 程式設計師 IT_PROG 調薪 15%

Page 21: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-18 Chapter 5 使用轉換函數及 SQL 條件表達式

3. 職員 ST_CLERK 調薪 10%

4. 其他職務調薪 5%

解析:

1. 在 employees 資料表中,職務存於 JOB_ID 欄,薪水存於 salary 欄。

2. 本例題關鍵在如何依不同條件達成對應之運算。

3. 使用 CASE.. WHEN..ELSE 之寫法如下:

CASE job_id WHEN 'SAL_REP' THEN salary*1.2 WHEN 'IT_PROG' THEN salary*1.15 WHEN 'ST_CLERK' THEN salary*1.1 ELSE salary*1.05 END

4. SQL 語句:

SELECT employee_id, last_name, job_id, salary "原薪水",

CASE job_id WHEN 'SAL_REP' THEN salary*1.2 WHEN 'IT_PROG' THEN salary*1.15 WHEN 'ST_CLERK' THEN salary*1.1 ELSE salary*1.05 END "調整後薪水"

FROM employees;

說明:

1. Salary 欄位之別名為 "原薪水"。

2. CASE 語句的預設返回值為 salary*1.05。

3. CASE 語句運算結果之別名為 "調整後薪水"。

Page 22: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.4 SELECT 語句的若..則..否則..流程控制 5-19

執行結果(部分):

二、DECODE 函數

SQL 語句格式:

SELECT 欄位[ , 欄位, ...] , DECODE ( expr 比較條件 1 , 返回值 1

[ , 比較條件 2 , 返回值 2

, 比較條件 N , 返回值 N]

[ , 預設返回值 ])

FROM 表格

[WHERE..條件]

[ORDER BY 欄位]

作用:

在 SELECT 語句中,完成「若..則..否則」之條件動作。

說明:

1. DECODE 函數內 expr 可為欄位或表述式。

2. 各個比較條件直接寫比較值,不可再寫比較欄位名稱。

3. 各個返回值可為欄位或表述式。

Page 23: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-20 Chapter 5 使用轉換函數及 SQL 條件表達式

4. DECODE 函數的最後面可以加上字串(用雙引號括著)當為此及

函數執行結果之別名。

例題 5.4.2

用 DECODE 函數重寫問題 5.4.1。

解析:

1. 本例題關鍵在如何依不同條件達成對應之運算。

2. 使用 DECODE 函數之寫法如下:

DECODE( job_id , 'SAL_REP', salary*1.2 , 'IT_PROG', salary*1.15 , 'ST_CLERK',salary*1.1 , salary*1.05)

SQL 語句:

SELECT employee_id, last_name, job_id, salary "原薪水",

DECODE( job_id , 'SAL_REP', salary*1.2 , 'IT_PROG', salary*1.15 , 'ST_CLERK',salary*1.1 , salary*1.05) "調整後薪水"

FROM employees;

說明:

1. Salary 欄位之別名為 "原薪水"。

2. DECODE 函數運算結果之別名為 "調整後薪水"。

執行結果:

同例題 5.4.1。

Page 24: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5.4 SELECT 語句的若..則..否則..流程控制 5-21

總結

經由本章,您學到了:

1. 資料類型隱性轉換的時機。

2. 資料類型顯性轉換的時機。

3. 使用字符型別與數值型別轉換函數。

4. 使用日期型別與字符型別轉換函數。

5. 使用空值轉換函數。

6. 使用 CASE述式或 DECODE( ) 函數,在 SELECT子句達成「若..則..否

則..」運算之功能。

本章 5.1 小節至 5.3 小節為核心學習項目,一定要學會。5.4 小節為進階學

習項目,請斟酌學習。

Page 25: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

5-22 Chapter 5 使用轉換函數及 SQL 條件表達式

學習評量

請選擇下列各題正確答案並解釋原因,且在 ORACLE 資料庫上實作:

1. 檢視 OE帳戶的 ORDERS資料表。請評估如下 SQL語句之執行,下列敘述何者正確?

SELECT order_id, customer_id FROM orders WHERE order_date > 'June 30 2001';

A. 不能執行,因 WHERE子句內的日期 'June 30 2001' 未使用雙引號 括著。

B. 可以執行,且將輸出 ORDEER_DATE大於 'June 30 2001' 所有資料列之 ORDER_ID及 CUSTOMER_ID。

C. 不能執行,因 WHERE子句內的日期 'June 30 2001' 無法隱性轉換,須用 TO_DATE轉換函數才能執行。

D. 不能執行,因 WHERE子句內的日期 'June 30 2001' 無法隱性轉換,須用 TO_CHAR轉換函數才能執行。

2. 檢視 OE帳戶的 PRODUCT_INFORMATION資料表。請評估如下 SQL語句之執行,下列敘述何者正確?

SELECT TO_CHAR(list_price,'$9,999') FROM product_information;

A. LIST_PRICE欄位值為 1123.90,結果顯示為 $1,124。

B. LIST_PRICE欄位值為 1123.90,結果顯示為 $1,123。

C. LIST_PRICE欄位值為 11235.90,結果顯示為 $1,123。

D. LIST_PRICE欄位值為 11235.90,結果顯示為 #######。

Page 26: 證有 3 ORACLEepaper.gotop.com.tw/PDFSample/AED002800.pdf · 在ORACLE認證項目中,OCE(Oracle Database Certified SQL Expert) 是資料庫上的專業認證,是對系統導入人員的知識、技術以及操作技能之最高

學習評量 5-23

學習評量

3. 檢視 HR帳戶的 EMPLOYEES資料表。請問下列哪個 SQL語句可計算

每位員工之總收入?員工總收入等於年薪加上年薪乘紅利百分比,且

僅有少數人獲得紅利。

A. SELECT first_name, salary, salary*12+salary*commission_pct "Total" FROM EMPLOYEES;

B. SELECT first_name, salary, salary*12+NVL((salary*commission_pct),

0) "Total" FROM EMPLOYEES;

C. SELECT first_name, salary, salary*12 + NVL(salary, 0)*commission_pct

"Total" FROM EMPLOYEES;

D. SELECT first_name, salary, salary*12+(salary*NVL2(commission_pct, salary, salary+commission_pct)) "Total" FROM EMPLOYEES;

4. 配對下列函數及功能。

函數 功能描述

NVL 評估 NULL 及 NOT NULL。

NULLIF 用來從一列述式中返回第一個 NOT NULL 的值。

COALESCE 用來比較兩個述式,相等返回 NULL,不等返回第一個述式。

NVL2 用來轉換 NULL 值為指定值。

A. 1-A, 2-C, 3-B, 4-D

B. 1-D, 2-C, 3-B, 4-A

C. 1-B, 2-C, 3-D, 4-A

D. 1-D, 2-B, 3-C, 4-A