模拟场景,有一张Oracle 表:TEST
DDL:
CREATE TABLE TEST (
"USER_ID" VARCHAR2(50 BYTE) NOT NULL ,
"USER_NAME" VARCHAR2(255 BYTE)
)
插入数据:
INSERT INTO "TEST" VALUES ('1000', 'test01');
INSERT INTO "TEST" VALUES ('6a8471f211600f6c6a8d76f096552e78', 'test02');
执行搜索:
SELECT * FROM "TEST" where USER_ID not in (1000)
报错:
SELECT * FROM "TEST" where USER_ID not in (1000)
> ORA-01722: invalid number
> Time: 0.016s
百度了一下,错误一般是类型转换的时候出错,上面的SQL应该就是number类型转换的时候出错。
查找USER_ID的所有不同值,发现其中有一个值不是数字
SELECT DISTINCT(USER_ID) from TEST
解决方法:
1、如果这条数据是非必要数据,可以删除
2、因为表定义字段类型为VARCHAR2,使用字符串匹配:
SELECT * FROM "TEST" where USER_ID not in ('1000')
延伸:
oracle隐式转换
1、“=”号,比较符(not in等)两边的类型是否相同
2、如果“=”号两边的类型不同,尝试的去做转换
3、在转换时,要确保合法合理。不合法则转换异常。
隐式数据类型转换
(1)varchar2变长/char定长——>number,例如:'123'——>123
(2)varchar2/char——>date,例如:'25-4月-15'——>'25-4月-15'
(3)number——>varchar2/char,例如:123——>'123'
(4)date——>varchar2/char,例如:'25-4月-15'——>'25-4月-15'