最近在做項(xiàng)目遷移,Oracle版本的遷到Mysql版本,遇到有些oracle的函數(shù),mysql并沒有,所以就只好想自定義函數(shù)或者找到替換函數(shù)的方法進(jìn)行改造。
oracle做數(shù)據(jù)排序的時(shí)候,有時(shí)候可以用nulls first或者nulls last將null值排在最前或者最后。
oracle方法:
null值排在最前
select * from A order by a desc null first
null值排在最后
select * from A order by a desc null last
不過遷到Mysql的話,mysql并沒有提供類似函數(shù),所以要怎么實(shí)現(xiàn)?下面給出解決方法:
null值排在最后,用Mysql的IF和ISNULL函數(shù)。如果為空返回1,否返回0
select * from A order by IF(ISNULL(a),1,0),a desc
null值排在最前,用Mysql的IF和ISNULL函數(shù)。如果為空返回1,否返回0
select * from A order by IF(ISNULL(a),0,1),a desc
如果mybatis里需要oracle和Mysql版本的,或者可以從后臺(tái)傳個(gè)數(shù)據(jù)表版本標(biāo)識(shí)dbType,或者直接用mybatis的_databaseId方法。
<if test="dbType=='oracle'">
order by c.create_date desc nulls last
</if>
<if test="dbType=='mysql'">
order by IF(ISNULL(c.create_date),1,0), c.create_date desc
</if>