Sql中的if函數學習

今天,在修改項目bug時遇到一些須要計算的功能實現,雖然能夠用java代碼寫,可是因爲時間較爲充裕,有嘗試用sql寫一下,學習到了if函數java

if(o.containerSendNet>0 and o.pieceNumber=0 , o.containerSendNet*IFNULL(o.transport_price2,0),0) transitWeightMoney

上面這段話的意思是:mysql

若是o.containerSendNet>0 and o.pieceNumber=0 成立爲true,則返回o.containerSendNet*IFNULL(o.transport_price2,0),即transitWeightMoney = o.containerSendNet*IFNULL(o.transport_price2,0)sql

不然返回0,即transitWeightMoney  = 0;函數

而IFNULL函數,則是判斷第一個表達式是否爲null,即IFNULL(o.transport_price2,0),若是o.transport_price2不爲null,則返回這個值,不然返回0。學習

下面摘抄我看到的一篇博客:https://blog.csdn.net/qq_36850813/article/details/80449860url

 

IF 表達式

IF( expr1 , expr2 , expr3 )

expr1 的值爲 TRUE,則返回值爲 expr2 
expr1 的值爲FALSE,則返回值爲 expr3spa

 

以下:.net

SELECT IF(TRUE,1+1,1+2); -> 2  
  
SELECT IF(FALSE,1+1,1+2); -> 3  
  
SELECT IF(STRCMP("111","222"),"不相等","相等"); -> 不相等

那麼這個 IF 有啥用處呢?舉個例子: 
查找出售價爲 50 的書,若是是 java 書的話,就要標註爲 已售完 
code

那麼對應的SQL語句該怎樣去寫呢?blog

select *,if(book_name='java','已賣完','有貨') as product_status from book where price =50

 

IFNULL 表達式

IFNULL( expr1 , expr2 )

 

判斷第一個參數expr1是否爲NULL:

 

    若是expr1不爲空,直接返回expr1;

 

    若是expr1爲空,返回第二個參數 expr2   

 

經常使用在算術表達式計算和組函數中,用來對null值進行轉換處理(返回值是數字或者字符串)


在 expr1 的值不爲 NULL的狀況下都返回 expr1,不然返回 expr2,以下:

SELECT IFNULL(NULL,"11"); -> 11  
      
    SELECT IFNULL("00","11"); -> 00

 

NULLIF 表達式

 

NULLIF(expr1,expr2):若是兩個參數相等則返回NULL,不然返回第一個參數的值expr1

 

 mysql> select nullif(1,1),nullif(123,321); +-------------+-----------------+
| nullif(1,1) | nullif(123,321) |
+-------------+-----------------+
|        NULL |             123 |
+-------------+-----------------+

 

 

三、在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          |
+--------+--------------+
相關文章
相關標籤/搜索