第一步:先创建两个测试表
第一个表:
create table test_a
(
id_no number
,vchar varchar2(50)
);
第二个表:
create table test_b
(
id_no number
,vnum number
);
第二步:往表里插入数据
insert into TEST_A (ID_NO, VCHAR)values (1, '奥特曼');
insert into TEST_A (ID_NO, VCHAR)values (2, 'WPS');
insert into TEST_A (ID_NO, VCHAR)values (3, '10');
insert into test_b (ID_NO, VNUM)values (1, 10);
insert into test_b (ID_NO, VNUM)values (2, 11);
insert into test_b (ID_NO, VNUM)values (3, 12);
第三步:写出问题SQL:
select * from test_a
where vchar in (select vnum from test_b)
错误原因以前这样用没有问题的原因是,以前碰到的字段,虽然都是字符型,但是里面存的确是都是一些数字,
因此在Oracle默认转换为数字的的时候不会问题。但是这个字段里面,不仅有数字,还有中文和英文,都是实打实的
字符串,无法在默认转换的时候被转换成数字,所以就会报错无效数字。由于以前不好的习惯,导致了这个失误。甚至
会觉得自己没有错误,因为以前都是这样写的。
自我反省
不能因为Oracle越来越人性化,而忽视代码书写的严谨性。严格要求自己。
正确的写法:
select * from test_a
where vchar in (select to_char(vnum) from test_b)