SQL:如何查找varchar列的内容是否为数字?

时间:2009-07-03 17:07:01

标签: sql oracle

我表中的一列是一个varchar,它应该只包含数值(我不能将定义更改为数字列)。因此我的SQL查询:

select to_number(col1) from tbl1 where ...

失败,因为对于某些行,列的内容不是数字。

我可以使用什么select查询来查找这些行?

我正在使用Oracle数据库

我正在寻找类似is_number功能的东西。

4 个答案:

答案 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'的字符串(因为逗号)。