在Check中使用Case函數
在Check中使用Case函數在很多情況下都是非常不錯的解決方案。可能有很多人根本就不用Check,那麼我建議你在看過下面的例子之後也嘗試一下在SQL中使用Check。
下面我們來舉個例子:
公司A,這個公司有個規定,女職員的工資必須高於1000塊。如果用Check和Case來表現的話,如下所示 :
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary > 1000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )
如果單純使用Check,如下所示:
CONSTRAINT check_salary CHECK
( sex = '2' AND salary > 1000 )
女職員的條件倒是符合了,男職員就無法輸入了。
六,在Case函數中使用sum函數
假X有下面一個表
學號 課程ID(class_id) 課程名(class_name) 主修(main_class_fl)
-------------------------------------------------------------
100 1 經濟學 y
100 2 曆史學 N
200 2 曆史學 N
200 3 考古學 Y
200 4 電腦 N
300 4 電腦 N
400 5 化學 N
500 6 數學 N
有的學生選擇了同時修幾門課程(100,200),也有的學生只選擇了一門課程(300,400,500)。選修多門課程的學生,要選擇一門課程作為主修,主修fl裡面寫入 Y。只選擇一門課程的學生,主修fl為N(實際上要是寫入Y的話,就沒有下面的麻煩事了,為了舉例子,還請多多包含)。
現在我們要按照下面兩個條件對這個表進行查詢 : 只選修一門課程的人,返回那門課程的ID , 選修多門課程的人,返回所選的主課程ID。 簡單的想法就是,執行兩條不同的SQL語句進行查詢。
--條件1:只選擇了一門課程的學生
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*) = 1;
執行結果1
STD_ID MAIN_class
------ ----------
300 4
400 5
500 6
--條件2:選擇多門課程的學生
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_fl = 'Y' ;
執行結果2
STD_ID MAIN_class
------ ----------
100 1
200 3
如果使用Case函數,我們只要一條SQL語句就可以解決問題,具體如下所示 :
代碼
SELECT std_id,
CASE WHEN COUNT(*) = 1 --只選擇一門課程的學生的情況
THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_fl = 'Y'
THEN class_id
ELSE NULL END
)
END AS main_class
FROM Studentclass
GROUP BY std_id;
運行結果
STD_ID MAIN_class
------ ----------
100 1
200 3
300 4
400 5
500 6
通過在Case函數中嵌套Case函數,在合計函數中使用Case函數等方法,我們可以輕鬆的解決這個問題。使用Case函數給我們帶來了更大的自由度。 最後提醒一下使用Case函數的新手注意不要犯下面的錯誤:
CASE col_1
WHEN 1 THEN 'Right'
WHEN NULL THEN 'Wrong'
END
在這個語句中When Null這一行總是返回unknown,所以永遠不會出現Wrong的情況。因為這句可以替換成WHEN col_1 = NULL,這是一個錯誤的用法,這個時候我們應該選擇用WHEN col_1 IS NULL。