CASE在SQL語句中,很有點類似java等高級編程語言中的switch這樣子的多分枝語句,但是有點不同的是,case后面接的是when,另外,when的后續分枝有點類似if后面接else。這個是我的個人認識,case 。。when。。then。。[else]。。
下面,看看MySQL的幫助信息,可以看到case的基本語法結構:
1 topics: #CASE的兩種基本用法 2 CASE OPERATOR 3 CASE STATEMENT 4 5 MariaDB [mysql]> help case statement; #case的第一種用法 6 Name: 'CASE STATEMENT' 7 Description: 8 Syntax: 9 CASE case_value 10 WHEN when_value THEN statement_list 11 [WHEN when_value THEN statement_list] ... 12 [ELSE statement_list] 13 END CASE 14 15 Or: 16 17 CASE 18 WHEN search_condition THEN statement_list 19 [WHEN search_condition THEN statement_list] ... 20 [ELSE statement_list] 21 END CASE 22 23 MariaDB [mysql]> help case operator; #case的第二種基本用法 24 Name: 'CASE OPERATOR' 25 Description: 26 Syntax: 27 CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN 28 result ...] [ELSE result] END 29 30 CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] 31 [ELSE result] END
這里,我還需要說明的是,case可以和select,check,update等一起配合使用,相當於增加了SQL操作的條件分析,是的SQL寫的可以更加強大。
1. select的配合用法
1 Examples: 2 MariaDB> SELECT CASE 1 WHEN 1 THEN 'one' 3 -> WHEN 2 THEN 'two' ELSE 'more' END; 4 -> 'one' 5 MariaDB> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; 6 -> 'true' 7 MariaDB> SELECT CASE BINARY 'B' 8 -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; 9 -> NULL
1 MariaDB [test]> select * from casetbl; 2 +----+------+---------+---------+--------+ 3 | id | age | name | country | salary | 4 +----+------+---------+---------+--------+ 5 | 1 | 33 | shihuc | china | 1000 | 6 | 2 | 34 | water | china | 2000 | 7 | 3 | 20 | taikang | america | 3000 | 8 | 4 | 50 | amazon | america | 5000 | 9 +----+------+---------+---------+--------+ 10 4 rows in set (0.00 sec) 11 12 MariaDB [test]> SELECT 13 -> CASE WHEN salary <= 2000 THEN '1' 14 -> WHEN salary > 2000 AND salary <= 4000 THEN '2' 15 -> ELSE NULL END salary_class, 16 -> COUNT(*) FROM casetbl 17 -> GROUP BY 18 -> CASE WHEN salary <= 2000 THEN '1' 19 -> WHEN salary > 2000 AND salary <= 4000 THEN '2' 20 -> ELSE NULL END; 21 +--------------+----------+ 22 | salary_class | COUNT(*) | 23 +--------------+----------+ 24 | NULL | 1 | 25 | 1 | 2 | 26 | 2 | 1 | 27 +--------------+----------+ 28 3 rows in set (0.00 sec)
2. check的配合用法
比如,某些公司對於男性員工招聘的時候有年齡的限制,年齡必須小於40歲,當數據插入到表中的時候,這個年齡就會自動被檢查。
1 MariaDB [test]> create table casechktbl( 2 -> id int primary key auto_increment, 3 -> age int not null, 4 -> name varchar(30), 5 -> salary int (5) check (case when age > 35 then 1 else 0 end)); 6 Query OK, 0 rows affected (0.25 sec) 7 8 MariaDB [test]> desc casechktbl; 9 +--------+-------------+------+-----+---------+----------------+ 10 | Field | Type | Null | Key | Default | Extra | 11 +--------+-------------+------+-----+---------+----------------+ 12 | id | int(11) | NO | PRI | NULL | auto_increment | 13 | age | int(11) | NO | | NULL | | 14 | name | varchar(30) | YES | | NULL | | 15 | salary | int(5) | YES | | NULL | | 16 +--------+-------------+------+-----+---------+----------------+ 17 4 rows in set (0.03 sec) 18 19 MariaDB [test]> insert into casechktbl (name, age, salary) values("hailang", 36, 10); 20 Query OK, 1 row affected (0.04 sec) 21 22 MariaDB [test]> select * from casechktbl; 23 +----+-----+---------+--------+ 24 | id | age | name | salary | 25 +----+-----+---------+--------+ 26 | 1 | 36 | hailang | 10 | 27 +----+-----+---------+--------+ 28 1 row in set (0.00 sec)
這里需要說明的是,這個測試是在MySQL下進行的,這個例子可能看不出什么問題,因為MySQL中的check其實是一個擺設,不起重要(當用於約束的時候)。
3. update配合使用
有如下更新條件
1.工資5000以上的職員,工資減少10%。 2.工資在2000到4600之間的職員,工資增加15%
很容易考慮的是選擇執行兩次UPDATE語句,如下所示
--條件1
UPDATE Personnel SET salary = salary * 0.9
WHERE salary >= 5000;
--條件2
UPDATE Personnel SET salary = salary * 1.15
WHERE salary >= 2000 AND salary < 4600;
這個例子,其實很容易看出問題,因為這兩個條件語句的執行是分開操作的,所以會出現抖動,就是說執行第一個條件后,他的工資變成了符合第二個條件的情況,則會再次被修改。
比如路人甲的工資是5000,執行第一個修改后,變成了4500,很顯然這個水平符合第二個條件,就是要增長10%,則最終其工資為5175.他這么一調整,工資不降反增了。。。
所以,需要用case條件來處理。
1 MariaDB [test]> select * from casetbl; 2 +----+------+---------+---------+--------+ 3 | id | age | name | country | salary | 4 +----+------+---------+---------+--------+ 5 | 1 | 33 | shihuc | china | 1000 | 6 | 2 | 34 | water | china | 2000 | 7 | 3 | 20 | taikang | america | 3000 | 8 | 4 | 50 | amazon | america | 5000 | 9 | 5 | 37 | hailang | germany | 5000 | 10 +----+------+---------+---------+--------+ 11 5 rows in set (0.00 sec) 12 13 14 MariaDB [test]> update casetbl set salary = 15 -> case when salary >= 5000 then salary * 0.9 16 -> when salary >=2000 and salary <4600 then salary * 1.15 17 -> else salary end; 18 Query OK, 4 rows affected (0.05 sec) 19 Rows matched: 5 Changed: 4 Warnings: 0 20 21 MariaDB [test]> 22 MariaDB [test]> select * from casetbl; 23 +----+------+---------+---------+--------+ 24 | id | age | name | country | salary | 25 +----+------+---------+---------+--------+ 26 | 1 | 33 | shihuc | china | 1000 | 27 | 2 | 34 | water | china | 2300 | 28 | 3 | 20 | taikang | america | 3450 | 29 | 4 | 50 | amazon | america | 4500 | 30 | 5 | 37 | hailang | germany | 4500 | 31 +----+------+---------+---------+--------+ 32 5 rows in set (0.00 sec)
從上面的結果,是不是很容易看出結果是符合邏輯的。