我有这个包含varchar的数据库。
我想知道哪些记录包含数值。我试过REGEXP_COUNT
和其他但我在9i上跑,我认为这是10g>
我怎样才能做到这一点?
我试过了:
select to_number( my_column ) from my_table
但它不起作用,因为并非所有这些都是数字的。
修改
背景
此表包含员工ID,所有这些都是数字(读取1234或24523或6655)
在初始数据库加载中,当员工ID未知而不是使用-1
这样的内容时,他们输入了以下文本:
NA, N/A, NONE, UNK, UNKNOW, TEST, EXTERNAL, WITHOUT_ID
真正的主要错误是,该列是varchar
而不是它应该的数字。
现在,我尝试做的是获取非数字记录(不包含员工ID),但由于该数据库是9i,我无法使用RegExp
答案 0 :(得分:4)
我担心你必须编写你自己的isnumber函数,然后使用它,这个({3}}中找到的这种(未经测试的)应该有效。
DECLARE FUNCTION isNumber(p_text IN VARCHAR2) RETURN NUMBER IS
v_dummy NUMBER;
not_number EXCEPTION;
PRAGMA EXCEPTION_INIT(-, not_number);
BEGIN
v_dummy := TO_NUMBER(p_text);
RETURN 1;
EXCEPTION
WHEN not_number THEN RETURN 0;
END is_number;
之后,您可以使用与您的isnumber功能相结合的解码功能来获得所需的结果。
答案 1 :(得分:3)
另一个纯SQL解决方法:
select my_column
from my_table
where translate(my_column,'x0123456789','x') is null;
答案 2 :(得分:1)
取决于您的数字'数字'。你是否允许负数,小数或只是整数,或科学记数法(例如'1e3')。是否允许前导零?
如果您只想要正整数值,请尝试
where translate(col,' 1234567890','0') is null
答案 3 :(得分:1)
试试这个
CREATE OR REPLACE PACKAGE value_tests
AS
FUNCTION get_number( pv_value IN VARCHAR2 ) RETURN NUMBER;
END;
/
CREATE OR REPLACE PACKAGE BODY value_tests
AS
FUNCTION get_number( pv_value IN VARCHAR2 ) RETURN NUMBER
IS
converted_number NUMBER;
invalid_number EXCEPTION;
PRAGMA EXCEPTION_INIT( invalid_number, -01722 );
value_error EXCEPTION;
PRAGMA EXCEPTION_INIT( value_error, -06502 );
BEGIN
<<try_conversion>>
BEGIN
converted_number := TO_NUMBER( pv_value );
EXCEPTION
WHEN invalid_number OR value_error
THEN
converted_number := NULL;
END try_conversion;
RETURN converted_number;
END get_number;
END;
/
在此上运行...
select my_column
, value_tests.get_number( my_column ) my_column_num
from ( select 'mydoghas3legs' my_column from dual
union all select '27.5' my_column from dual
union all select '27.50.5' my_column from dual
)
返回
MY_COLUMN MY_COLUMN_NUM
------------- -------------
mydoghas3legs
27.5 27.5
27.50.5
答案 4 :(得分:1)
我不喜欢在普通代码中使用异常,但这似乎是最好和最安全的方法:
CREATE OR REPLACE FUNCTION "IS_NUMBER" (pX in varchar2) return integer is
n number;
begin
n:=to_number(pX);
return 1;
exception
when others then
return 0;
end;
答案 5 :(得分:0)
我设法解决这个问题:
select my_column
from my_table
where my_column not like '%1%'
and my_column not like '%2%'
and my_column not like '%3%'
and my_column not like '%4%'
and my_column not like '%5%'
and my_column not like '%6%'
and my_column not like '%7%'
and my_column not like '%8%'
and my_column not like '%9%'
and my_column not like '%0%'
很脏,但是有效。 ;)
答案 6 :(得分:0)
另一种方法,这是我前段时间写的一个功能:
CREATE OR REPLACE function string_is_numeric
(p_string_in in varchar2)
return boolean is
begin
for i in 1..length(p_string_in) loop
if substr(p_string_in, i, 1) not in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') then
return false;
end if;
end loop;
return true;
end;
/
正如pedromarce的回答所指出的,您可能需要将其从布尔返回更改为数字或varchar2以更好地满足您的需求。
答案 7 :(得分:0)
这是我的例程版本,类似于pedromarce发布的版本。请注意,由于“ - ”异常编号,发布的示例无法编译。这个例子编译和工作:
create or replace function IsNumber(
a_Text varchar2
) return char is
t_Test number;
begin
begin
t_Test := to_number(a_Text);
return 'Y';
exception when value_error then
return 'N';
end;
end;
使用示例:
select IsNumber('zzz') from dual;
结果:N
select IsNumber('123.45') from dual;
结果:Y