條件判斷表達式是為了實現控制流,也就是判斷在不同的條件下執行不同的流程。
MySQL中提供了三種條件判斷函數:IF()、IFNULL()與CASE。本文就逐一對其邏輯及使用方法進行探索。
【1】IF()
先看看其語法格式:IF(expr,v1,v2);
再看看其執行邏輯:若expr是TRUE(即:expr <> 0 and expr <> NULL),則該函數返回值為v1,否則返回值為v2。
所以,我們得出結論是其返回的值是在函數的入參中指定。
接著我們來從簡單案例著手,由淺入深來探索其真正的價值。
IF(2019 > 2018,TRUE,FALES)執行報錯,我們可以得知函數中可以指定的值為MySQL保留詞;從IF(2019 > 2018,TRUE,FALSE)返回結果為1而不是TRUE可以得知,MySQL對TRUE再做了一次運算,即視TRUE為1;接著我們嘗試是否可以在expr封裝其他複雜邏輯(譬如函數)。
函數STRCMP('AEV','UCR')的計算結果為-1,即不等於0也不為NULL;依據函數STRCMP('AEV','UCR')的返回值,IF()返回的結果是v1(即:YES)。【2】IFNULL()
該函數則相對比較簡單,從它的語法格式IFNULL(v1,v2)可以看出它只需定義返回值不需定義判斷表達式,因為其函數名本身就是判斷的含義。
判斷兩個參數是否為NULL;若兩個參數都不為空,則返回第一個參數值;若第一個為空則返回第二個參數值;兩個參數也是可以封裝更複雜的運算(譬如函數)。【3】CASE
看語法格式我們會發現此類函數寫法上比較麻煩,但其表達的邏輯卻最貼近我們日常的思維習慣。
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] ... [WHEN vn THEN rn] ... [ELSE r(n+1)] END或CASE WHEN v1 THEN r1 [WHEN v2 THEN r2] ... [WHEN vn THEN rn] ... ELSE r(n+1)] END
用通俗的話來讀這個判斷函數的就是:在條件expr滿足條件v1就返回值r1,滿足條件v2就返回值r2……否則就返回一個指定的值r(n+1)。
我們也可以看看第二種寫法。
【結論】兩種寫法的效果是一致的。
總結
MySQL的條件判斷函數有3大類;每種條件判斷函數中都是可以封裝更複雜的運算邏輯;每種條件判斷函數的返回值都是在參數中指定(具體值或表達式計算結果)。