oracle数据库中varchar类型字段中存放的有数字和汉字情况,比较大小问题解决

9 篇文章 0 订阅
9 篇文章 0 订阅

如果你也正在为这种问题头疼,当你看到我这篇博客时,恭喜你,问题的解决方案来了,你头疼的问题可以解决了。

这个问题是我在最近的项目中遇到的难题,上网查阅了很多资料,用什么平常使用的“<,<=,>,>=”都没能解决问题,最后还是问了大牛,才解决!现在共享给大家。

先描述下我遇到的问题:

在项目中,前端要展示一些产品,并有一些查询筛选条件,在收益率这个条件上,出现了这个问题,收益率的筛选条件值有“全部,4-8%,8-11%,11%以上,浮动收益”,这个条件从前端传到后端的类型为string,并且这个字段在oracle数据库里为varchar类型,数据库中这个字段的值存放的有数字如12.2等,也有汉字如浮动收益等,还有为空等情况。


解决方案

我在DAO层的Java代码和sql语句中做了改动。

sql 语句类似如下:(红色的4和10,代表的比较的大小范围,根据自己的情况改动)

select nvl(ADVANCE_RECEIPT,0from   T_VIP_FUNDINFO   WHERE  REGEXP_LIKE(ADVANCE_RECEIPT,'^[0-9]'and nvl(ADVANCE_RECEIPT,0)>4 and nvl(ADVANCE_RECEIPT,0)<10;

由于前端传来的数据是String类型的,所以需要对数据进行类型转换为整数Integer.valueOf()即可。

下面贴出我DAO层的Java代码:

if (StringHelper.isNotEmpty(advance_receipt)) //预期收益
{
if (advance_receipt.indexOf("-") != -1)
{
String[] tls = advance_receipt.split("-");
if (tls != null && tls.length >= 1)
{
if (tls.length >= 2)
{
sql.append("AND REGEXP_LIKE(V.ADVANCE_RECEIPT,'^[0-9]') AND   nvl(V.ADVANCE_RECEIPT,0) >= ? AND nvl(v.ADVANCE_RECEIPT,0) < ?");
param.add(Integer.valueOf(tls[0]));
param.add(Integer.valueOf(tls[1]));
}
else
{
sql.append("AND REGEXP_LIKE(V.ADVANCE_RECEIPT,'^[0-9]') and   nvl(V.ADVANCE_RECEIPT,0)>=? ");
param.add(Integer.valueOf(tls[0]));
}
}
else
{
sql.append(" AND V.ADVANCE_RECEIPT = ? ");
param.add(advance_receipt);
}
}
else
{
sql.append(" AND V.ADVANCE_RECEIPT = ? ");
param.add(advance_receipt);
}
}
解决原理:
看完的人,都应该明白其中的原理:
第一用到了正则表达式REGEXP_LIKE(V.ADVANCE_RECEIPT,'^[0-9]'),这个表达式的意思此时查询时只查询数字的情况,不会因数据库里存放有汉字而报“无效数字”的异常情况。不会查询汉字的记录。
第二用到了数值赋值方法nvl(V.ADVANCE_RECEIPT,0) , 这个的用处就是如果值为空就赋值为0

下面是问题的扩展情况:

假设在项目中,前端要展示一些产品,并有一些查询筛选条件,在收益率这个条件上,出现了这个问题,收益率的筛选条件值有“全部,4-8%,8-11%,11%以上”,这个条件从前端传到后端的类型为string,并且这个字段在oracle数据库里为varchar类型,数据库中这个字段的值存放的只有数字如12.2等这一种情况。

此时,要比较的话,就用to_number()来解决。sql语句如:ANDto_number(V.ADVANCE_RECEIPT)>10





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值