我有一个数据表tab1,大概100万条记录。里面有一个字段(field1)是varchar2类型的,但是其实里面存储的是数字格式的字符。
我执行“select * from tab1 where to_number(field1)>=100000”的时候经常会报“数据不是合法数字类型”的错误。
但是我不知道具体出错的记录是哪个。
oracle里面有没有哪个函数可以对字符是否能够转换为数字(或者日期)进行判断呢?
我执行“select * from tab1 where to_number(field1)>=100000”的时候经常会报“数据不是合法数字类型”的错误。
但是我不知道具体出错的记录是哪个。
oracle里面有没有哪个函数可以对字符是否能够转换为数字(或者日期)进行判断呢?
from tab1
where translate(field1, '\\0123456789', '\\') is not null;
--10g以上还可以使用正则表达式函数
create or replace function isNumber(p_value in varchar2)
return pls_integer is
v_to number;begin
begin
v_to := to_number(p_value);
return(1); -----如果是返回1 exception
when others then
return(2);------如果不是返回2
end;end number_varchar;select isNumber(field1) from table
应该放在SELECT中用。。
SELECT to_number(p_value) INTO v_to FROM DUAL
select * from tab1 where f_number(field1)=0---1为数字 0不为数字
SQL> edi
已写入 file afiedt.buf 1 create or replace function f_number(p_num varchar2) return number
2 as
3 num number;
4 begin
5 if p_num is null then
6 return null;
7 end if;
8 num:=to_number(p_num);
9 return 1;
10 exception
11 when others then
12 return 0;
13* end;
SQL> /函数已创建。SQL> select f_number('122') from dual
2 /F_NUMBER('122')
---------------
1SQL> select f_number('12 22') from dual
2 /F_NUMBER('1222')
----------------
0SQL> select f_number(null) from dual
2 /F_NUMBER(NULL)
--------------
另外,如果字段(field1)是数字字符的话,你SQL语句中where后没必要进行to_number()转换,Oracle在执行查询的时候会隐式转换类型的,也就是直接select * from tab1 where field1>=100000就可以了
我现在需要一个函数,能够判断字符串内容是不是合法的数字形式,该如何判断。