关于oracle between and 的问题

某表有多个字段,其中a和b字段都是varchar2类型的,存的都是数值,为了查询符合条件的结果集,分别写了几条语句。
1、select * from tbname where a='100'(或100) and b between 1 and 100;
2、select * from tbname where b between 1 and 100;
3、select * from tbname where b between '1' and '100';
其中1正常执行,且返回结果符合要求,2会报错,提示无效的数字,3有返回,但是是按照ASCII码进行罗列的,不符合要求。
请问1为什么能正常执行?

b这列什么类型啊
你的b有问题感觉是

--创建一个表
create table test_hsj(
id int primary key,
num varchar2(12),
regDate date
)

select * from test_hsj;

--插入测试数据
insert into test_hsj values(1,'1', to_date('2015-05-01','y......
答案就在这里:oracle between and 边界问题
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

因为你的b列中有非数字字符串,例如a11,而你的1因为选择的是a=100的数据,a=100的数据中b列都是数字字符串,所以可以执行成功。

数据问题,第二条SQL语句是没问题的,你第一条查询出来的那条数据就证明有这种数据!
有2种可能:
1.b里面有其他字符串,不全是数字
2.b里面全是数字,但是数字后面可能有空格

应该是b列中的值有点问题

b列中有值不能隐式转换为数字,而且信息太少,不好定位那条数据有问题,可以把select * from tbname where b between 1 and 100;这个语句变成 1到10,11到20,复制10下,慢慢缩小范围,看看哪条数据有问题。

另外字符比较当然是用的asc码,但是你可以转换成数字再比,比如where to_number(b) between 1 and 100,但前提是b全部可以转换成数字,所以最终数据规范是前提,如果数据不规范你这些业务逻辑就有问题了

列b有非数字的字符,你可以用个语句验证一下select 1 from tbname where to_number(b) > 0;一定会报错