在調(diào)試的時(shí)候,mybatis卻一直報(bào)錯(cuò)該語(yǔ)句嘗試返回null但定義的返回類型時(shí)int。說(shuō)明這個(gè)函數(shù)并沒(méi)有起作用。那為什么沒(méi)有起作用呢?
那是因?yàn)檫@條語(yǔ)句的查詢結(jié)果就是空的,也就是說(shuō),當(dāng)傳進(jìn)來(lái)的參數(shù)是非子菜單時(shí)時(shí),下面這條語(yǔ)句的返回值就是null
1 (SELECT parent_id from menu where code = #{menuCode} and parent_id != 0)
當(dāng)這條語(yǔ)句返回null時(shí),整條語(yǔ)句的返回值都是空的(where分支比select分支優(yōu)先執(zhí)行),這時(shí),等價(jià)于下面這條語(yǔ)句:
1 SELECT IFNULL(id,0) from project_menu where code = NULL
這就不是這個(gè)當(dāng)id為空時(shí),用0替換id返回這個(gè)概念了,因?yàn)楫?dāng)語(yǔ)句本身就是null時(shí),語(yǔ)句中的函數(shù)還會(huì)起作用嗎?
所以,此方法行不通,附上解決方案:
SELECT
CASE
WHEN (SELECT parent_id from menu where code = #{code}) = 0
THEN 0
ELSE
(SELECT id from project_menu where code =
(SELECT code FROM menu where id =
(SELECT parent_id from menu where code =#{code} ))
AND project_id=#{projectId})
END
例子:原來(lái)的sql語(yǔ)句:select provinceID from kdmc_t_province where name =#{province}
由于name=的province本來(lái)就為null,導(dǎo)致ifnull無(wú)效
select ifnull(provinceID ,0) from kdmc_t_province where name =#{province}
解決方法:
select CASE WHEN (select provinceID from kdmc_t_province where name =#{province})is null THEN
0
ELSE (select provinceID from kdmc_t_province where name =#{province})
END;
解決!!