Oracle中使用max函数取表中字符串的最大值时出错的问题及原因

在Oracle数据库中,因orderno字段被错误定义为varchar2而非number,导致取最大值时出现异常,文章详细解析了这一问题及解决方案。

在开发过程中,遇到了一个问题,困扰了我好一阵子,问题是这样的:

这是Oracle数据库中的一个表,orderno是序列号,每次插入数据时加1

我们取序列号最大的值,按理说,orderno最大的应该是11,但是事实是这样的:

取出来最大的是9,而不是11,郁闷的好几天,最后让我给找到的原因:

orderno在建表的时候定义的是varchar2,而不是number,所以导致最大值取的是9

:max(column_name)

列column_name中的数据可以是数值、字符串或是日期时间数据类型。MAX()/MIN()函数将返回与被传递的列同一数据类型的单一值。

对于字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。

因此,可以知道,对于取字符型数据的最大值,先比较第一个字符,找到最大的就会返回此值,后面的字符就不会比较了,所以取出来的和我们需要的不一样。

解决办法:把字符类型的数据变成数值类型就可以了,使用to_number函数(这个办法适用于字符串是数值类型的,其他类型的没遇到过这样的问题)。

ps:找到解决办法时觉得怎么这么简单,但是实际上在最初遇到这个问题的时候,还是觉得很复杂的,一脸懵逼 o((⊙﹏⊙))o    一直在研究是不是sql语句写的有问题,而且在开发时没有报出具体的错,我只能一个办法一个办法的去测试,去找问题的原因,还好,坚持就是胜利,最后终于把原因找到了。

有些bug就是看上去难的一批,等到解决之后,会发现如此原来这么简单,所以不要被bug吓倒,你可以的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值