zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    背水一战 Windows 10 (90)
    背水一战 Windows 10 (89)
    背水一战 Windows 10 (88)
    背水一战 Windows 10 (87)
    背水一战 Windows 10 (86)
    背水一战 Windows 10 (85)
    背水一战 Windows 10 (84)
    背水一战 Windows 10 (83)
    背水一战 Windows 10 (82)
    背水一战 Windows 10 (81)
  • 原文地址:https://www.cnblogs.com/step-by-step1/p/4342367.html
Copyright © 2011-2022 走看看