我表中的一列是一个varchar,它应该只包含数值(我不能将定义更改为数字列)。因此我的SQL查询:
select to_number(col1) from tbl1 where ...
失败,因为对于某些行,列的内容不是数字。
我可以使用什么select
查询来查找这些行?
我正在使用Oracle数据库
我正在寻找类似is_number
功能的东西。
答案 0 :(得分:7)
oracle中没有本机“isnumeric”功能,但此链接向您展示如何制作一个: http://www.oracle.com/technetwork/issue-archive/o44asktom-089519.html
CREATE OR REPLACE FUNCTION isnumeric(p_string in varchar2)
RETURN BOOLEAN
AS
l_number number;
BEGIN
l_number := p_string;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END;
/
答案 1 :(得分:4)
我并不反对最好的解决方案是遵循其他人已经联系过的Tom Kyte的例子。但是,如果您只需要一些SQL,因为您遗憾地没有与DBA的关系来将pl / sql函数添加到模式中,您可以利用正则表达式来满足基本需求。例如:
select '234', REGEXP_SUBSTR('234','^\d*\.{0,1}\d+$') from dual
union all
select 'abc', REGEXP_SUBSTR('abc','^\d*\.{0,1}\d+$') from dual
union all
select '234234abc', REGEXP_SUBSTR('234234abc','^\d*\.{0,1}\d+$') from dual
union all
select '100.4', REGEXP_SUBSTR('100.4','^\d*\.{0,1}\d+$') from dual
union all
select '-100.4', REGEXP_SUBSTR('-100.4','^\d*\.{0,1}\d+$') from dual
union all
select '', REGEXP_SUBSTR('','^\d*\.{0,1}\d+$') from dual
以下是上述输出:
INPUT RESULT
234 234
abc -
234234abc -
100.4 100.4
-100.4 -
答案 2 :(得分:1)
答案 3 :(得分:1)
您可能需要自己决定什么是数字。 Oracle会愉快地将科学记数法(例如'1e10')中的字符串转换为数字,但它会避免使用类似'1,000'的字符串(因为逗号)。