DQL中常用的流程函數if_case 流程函數在一個SQL語句中實現條件選擇 模擬對職員薪水進行分類: 1、IF(expr1,expr2,expr3) 判斷第一個參數expr1為TRUE (expr1 <> 0 and expr1 <> NULL): 成功,返回第二個參數expr2 失敗,返回第三個 ...
DQL中常用的流程函數if_case
---流程函數在一個SQL語句中實現條件選擇
模擬對職員薪水進行分類:
mysql> create table salary_tab(userid int not null primary key,salary dec(9,2));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into salary_tab values(1,1000);
mysql> insert into salary_tab values(2,2000);
mysql> insert into salary_tab values(3,3000);
mysql> insert into salary_tab(userid) values(4);
mysql> insert into salary_tab values(5,1000);
mysql> select * from salary_tab;
+--------+---------+
| userid | salary |
+--------+---------+
| 1 | 1000.00 |
| 2 | 2000.00 |
| 3 | 3000.00 |
| 4 | NULL |
| 5 | 1000.00 |
+--------+---------+
5 rows in set (0.00 sec)
1、IF(expr1,expr2,expr3)
判斷第一個參數expr1為TRUE (expr1 <> 0 and expr1 <> NULL):
成功,返回第二個參數expr2
失敗,返回第三個參數expr3
返回值可以是數字、字元串、列值
mysql> select if(null,'非空','空');
+-------------------------+
| if(null,'非空','空') |
+-------------------------+
| 空 |
+-------------------------+
mysql> select userid,if(salary>2000,'high','low') from salary_tab;
+--------+------------------------------+
| userid | if(salary>2000,'high','low') |
+--------+------------------------------+
| 1 | low |
| 2 | low |
| 3 | high |
| 4 | low |
| 5 | low |
+--------+------------------------------+
mysql> select if(1>2,2,3),if(1<2,'yes','no');
+-------------+--------------------+
| if(1>2,2,3) | if(1<2,'yes','no') |
+-------------+--------------------+
| 3 | yes |
+-------------+--------------------+
2、IFNULL(expr1,expr2)
判斷第一個參數expr1是否為NULL:
如果expr1不為空,直接返回expr1;
如果expr1為空,返回第二個參數 expr2
常用在算術表達式計算和組函數中,用來對null值進行轉換處理(返回值是數字或者字元串)
mysql> select ifnull(salary,0) from salary_tab;
+------------------+
| ifnull(salary,0) |
+------------------+
| 1000.00 |
| 2000.00 |
| 3000.00 |
| 0.00 |
| 1000.00 |
+------------------+
mysql> select ifnull(1/0,'yes');
+-------------------+
| ifnull(1/0,'yes') |
+-------------------+
| yes |
+-------------------+
NULLIF(expr1,expr2):如果兩個參數相等則返回NULL,否則返回第一個參數的值expr1
mysql> select nullif(1,1),nullif(123,321);
+-------------+-----------------+
| nullif(1,1) | nullif(123,321) |
+-------------+-----------------+
| NULL | 123 |
+-------------+-----------------+
3、在SQL語句中實現“if-then-else”邏輯計算功能
有兩種形式:simple case和searched case
1)simple case的語法結構:
CASE value
WHEN [compare_value] THEN result
[WHEN [compare_value] THEN result ...]
[ELSE result] END
語義:
將case後面的值value分別和每個when子句後面的值compare_value進行相等比較:
如果一旦和某個when子句後面的值相等則返回相應的then子句後面的值result;
如果和所有when子句後面的值都不相等,則返回else子句後面的值;
如果沒有else部分則返回null。
註意:
①value可以是字面量、表達式或者列名
②CASE表達式的數據類型取決於跟在then或else後面的表達式的類型
類型必須相同(可嘗試做隱式類型轉換),否則出錯
mysql> select userid,case salary
-> when 1000 then 'low'
-> when 2000 then 'med'
-> when 3000 then 'high'
-> else '無效值' end salary_grade
-> from salary_tab;
+--------+--------------+
| userid | salary_grade |
+--------+--------------+
| 1 | low |
| 2 | med |
| 3 | high |
| 4 | 無效值 |
| 5 | low |
+--------+--------------+
2)searched case的語法結構:
CASE
WHEN [condition] THEN result
[WHEN [condition] THEN result ...]
[ELSE result] END
語義:
如果某個when子句後面的條件condition為true,則返回相應的when子句後面的值result;
如果所有的when子句後面的條件condition都不為true,則返回else子句後面的值;
如果沒有else部分則返回null。
mysql> select userid,case
-> when salary<=1000 then 'low'
-> when salary=2000 then 'med'
-> when salary>=3000 then 'high'
-> else '無效值' end salary_grade
-> from salary_tab;
+--------+--------------+
| userid | salary_grade |
+--------+--------------+
| 1 | low |
| 2 | med |
| 3 | high |
| 4 | 無效值 |
| 5 | low |
+--------+--------------+