sql、hql中对varchar2类型使用max函数的问题

昨天,测试人员提了一个问题,商品分类查询中根据商品类别查询不到数据,不选中商品类别时可以查询到数据。经研究代码发现,由于历史原因系统商品分类有1、2、3...11个版本(对应的字段editioncode在数据库中为varchar(2)类型,值为纯数字),需要取得商品分类为最高的版本 即版本11。

经查,所使用的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),

查询的结果依旧是版本9对应的分类,难道是max函数对非number类型取最大值无效?经问度娘,确实如此,且对于sql语句可使用to_number函数,更改上述的sql为:

  select * from T_Codelevel a where a.editioncode = (select max(to_number(editioncode)) from T_Codelevel b),

查询结果正确,取得了版本为11的商品分类。然后按照此方法更改对应的hql语句,即:

  from TCodelevel a where a.editioncode = (select max(to_number(editioncode)) from TCodelevel b),

查询报错,脑袋瓜里一亮 难道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

转载于:https://www.cnblogs.com/step-by-step1/p/4342367.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值