SELECT中的if_case流程函數


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          |
+--------+--------------+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM