案例分析:記一次IF函數(shù)引發(fā)的血案

引言
今天一大早上,產(chǎn)品經(jīng)理楊姐就來找我說:“小米,趕緊看看群里,運(yùn)營的童鞋說系統(tǒng)無論是B端還是C端,秒殺頻道都不能打開了,每天都有秒殺活動,這事很著急啊”!好家伙,看來事情確實蠻嚴(yán)重的……
定位問題
我立刻打開電腦,查看日志,發(fā)現(xiàn)日志中報錯信息是 “SQL語句” 執(zhí)行錯誤,我把sql語句撈出來放到 Navicat 上,并填充相應(yīng)的參數(shù),發(fā)現(xiàn)報以下錯誤:

分析了該sql語句,并把 不相關(guān)的where查詢條件 干掉,最后把問題定位到這一行:

最終發(fā)現(xiàn)是 IF()函數(shù) 中,條件為 false 執(zhí)行的語句有問題,即“g.goods_sub_type IN NULL” 報錯!
修復(fù)問題
既然發(fā)現(xiàn)出現(xiàn)問題的地方,就開始著手修復(fù)問題,看了下業(yè)務(wù)邏輯,IN 后面的是一個固定的數(shù)組,所以把 IN 后面寫成固定數(shù)組即可,像這樣:

搞定!
MySQL IF()函數(shù)
IF()函數(shù)在條件為TRUE時返回一個值,如果條件為FALSE則返回另一個值。
語法如下:
IF(condition, value_if_true, value_if_false)
注意
IF() 函數(shù),無論 condition 為 true 還是 false,后面兩個語句是一定會被運(yùn)行的,即要保證 value_if_true 和 value_if_false 的語法是正確的,而不是認(rèn)為 condition 為 true 的時候,value_if_false 會移除掉。就像在本例中,開發(fā)人員錯誤的任務(wù)當(dāng) NULL IS NULL 的時候, 只有 1 = 1 ,而 g.goods_sub_type IN NULL 會去掉。
IN 語句后面的范圍一定要用 小括號 “()” 包裹才可以。
END
好兄弟可以點贊并關(guān)注我的公眾號“javaAnswer”,全部都是干貨。
