1. 程式人生 > 其它 >SQL總複習二:CASE表示式的妙用

SQL總複習二:CASE表示式的妙用

SQL中的case表示式的作用是用來對“某個變數”進行某種轉化,通常在select字句中使用

基本用法

舉個例子:

不難看出,case表示式很像我們的 if else 的作用,在發現為真的 WHEN 子句時,CASE 表示式的真假值判斷就會中止,而剩餘的 WHEN 子句會被忽略。case表示式有兩種寫法:

CASE sex
  WHEN '1' THEN '男'
  WHEN '2' THEN '女'
ELSE '其他' END
CASE WHEN sex = '1' THEN '男'
   WHEN sex = '2' THEN '女'
ELSE '其他' END
  • else這句非必須但最好帶上,如果when
    中沒有符合條件的,且有沒有else控制,那麼,這樣的case會返回null,null不是個好東西,所以你一定要儘量控制減少返回null的情況。
  • 簡單點說,在能寫列名和常量的地方,通常都可以寫 CASE 表示式,因為它返回的是一個標量值

使用case實現不同條件的統計

有如下一個表:

上圖中,下半部分查詢結果如何得到呢?即如果讓你查詢出各個省份的男生總數和女生總數你會怎麼搞呢?

看看如何用case實現的:

--檢視所有學生資訊
select StudentID,[Name],Province,Gender,(case Gender
                                    when 0 then N'女'
                                    when 1 then N'男'
                                    else '' end) StuGender
from dbo.T_Student

--查詢出各省的男女生總數:
select Province,
sum(case when Gender=1 then 1 else 0 end ) as MaleCount,
sum(case when Gender=0 then 1 else 0 end ) as FeMaleCount
from dbo.T_Student
group by Province

在update操作中使用case條件分支,對不同範圍的資料執行更新

比如有個員工薪資表Salaries,工資欄位為salary ,

假設現在需要根據以下條件對該表的資料進行更新。

  1. 對當前工資為 30 萬日元以上的員工,降薪 10%。
  2. 對當前工資為 25 萬日元以上且不滿 28 萬日元的員工,加薪 20%。

那麼更新的SQL語句可以這樣寫:

-- 用CASE 表示式寫分段的更新操作
UPDATE Salaries
   SET salary = CASE WHEN salary >= 300000
                     THEN salary * 0.9
                     WHEN salary >= 250000 AND salary < 280000
                     THEN salary * 1.2
                     ELSE salay END; 

生成每月資料統計報表

有以下兩張表:

那麼SQL語句可以這樣寫:

-- 表的匹配:使用IN 謂詞
SELECT course_name,
       CASE WHEN course_id IN
                    (SELECT course_id FROM OpenCourses
                      WHERE month = 200706) THEN '○'
            ELSE '×' END AS "6 月",
       CASE WHEN course_id IN
                    (SELECT course_id FROM OpenCourses
                      WHERE month = 200707) THEN '○'
            ELSE '×' END AS "7 月",
       CASE WHEN course_id IN
                    (SELECT course_id FROM OpenCourses
                      WHERE month = 200708) THEN '○'
            ELSE '×' END AS "8 月"
  FROM CourseMaster;

-- 表的匹配:使用EXISTS 謂詞
SELECT CM.course_name,
       CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                      WHERE month = 200706
                        AND OC.course_id = CM.course_id) THEN '○'
            ELSE '×' END AS "6 月",
       CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                      WHERE month = 200707
                        AND OC.course_id = CM.course_id) THEN '○'
            ELSE '×' END AS "7 月",
       CASE WHEN EXISTS
                    (SELECT course_id FROM OpenCourses OC
                      WHERE month = 200708
                        AND OC.course_id = CM.course_id) THEN '○'
            ELSE '×' END  AS "8 月"
  FROM CourseMaster CM;

case與行轉換成列

SELECT name,
 CASE WHEN SUM(CASE WHEN course = 'SQL 入門' THEN 1 ELSE NULL END) = 1
 THEN '○' ELSE NULL END AS "SQL 入門",
 CASE WHEN SUM(CASE WHEN course = 'UNIX 基礎' THEN 1 ELSE NULL END) = 1
 THEN '○' ELSE NULL END AS "UNIX 基礎",
 CASE WHEN SUM(CASE WHEN course = 'Java 中級' THEN 1 ELSE NULL END) = 1
 THEN '○' ELSE NULL END AS "Java 中級 "
 FROM Courses
 GROUP BY name;

case與null

當case使用的變數或列的值可能為null時,唯一正確的使用方式如下:

CASE 
	WHEN col_1 = 1 THEN '○'
 	WHEN col_1 IS NULL THEN '×'
END
 --而不是:
CASE col_1
 WHEN 1 THEN '○'
 WHEN NULL THEN '×'
END


瞭解更多請參考圖靈社群的《SQL進價教程》一書