昨天,測試人員提了一個問題,商品分類查詢中根據商品類別查詢不到數據,不選中商品類別時能夠查詢到數據。經研究代碼發現,因爲歷史緣由系統商品分類有一、二、3...11個版本(對應的字段editioncode在數據庫中爲varchar(2)類型,值爲純數字),須要取得商品分類爲最高的版本 即版本11。sql
經查,所使用的hql語句爲數據庫
from TCodelevel a where a.editioncode = (select max(editioncode) from TCodelevel b),函數
查詢結果倒是版本9對應的分類,一臉污水,而後把此hql拷貝到pl/sql中 改爲sql的形式,即測試
select * from T_Codelevel a where a.editioncode = (select max(editioncode) from T_Codelevel b),code
查詢的結果依舊是版本9對應的分類,難道是max函數對非number類型取最大值無效?經問度娘,確實如此,且對於sql語句可以使用to_number函數,更改上述的sql爲:it
select * from T_Codelevel a where a.editioncode = (select max(to_number(editioncode)) from T_Codelevel b),io
查詢結果正確,取得了版本爲11的商品分類。而後按照此方法更改對應的hql語句,即:ast
from TCodelevel a where a.editioncode = (select max(to_number(editioncode)) from TCodelevel b),test
查詢報錯,腦殼瓜裏一亮 難道hql語句中不能使用to_number函數,百度一下你就知道確實不能,可以使用cast函數轉成int類型,即:百度
from TCodelevel a where a.editioncode = (select max(cast(editioncode as int )) from TCodelevel b),
查詢結果無誤,至此問題解決。
總結以下:
對於varchar類型(值爲純數字)的取max值,
在sql語句中可考慮將該字段轉化爲number類型使用to_number函數;
例如:select max(to_number(t.number)) from test t
在hql語句中可以使用cast函數轉化爲number類型。
例如: select max(cast(t.number as int)) from test t
or
select max(cast(t.number, int)) from test t