如何确定SQL中的字符串是否为数字?

| 在Oracle 10g上的SQL查询中,我需要确定字符串是否为数字。我怎样才能做到这一点?     
已邀请:
您可以使用REGEXP_LIKE:
SELECT 1 FROM DUAL
WHERE REGEXP_LIKE(\'23.9\', \'^\\d+(\\.\\d+)?$\', \'\') 
    
您可以试试这个:
SELECT LENGTH(TRIM(TRANSLATE(string1, \' +-.0123456789\', \' \'))) FROM DUAL
其中string1是您要评估的内容。如果为数字,它将返回null。在这里寻找进一步的说明     
我没有访问10G实例进行测试的权限,但这在9i中有效: 创建或替换功能is_numeric(p_val VARCHAR2)    返回号码 是 v_val NUMBER; 开始    开始       如果p_val是NULL或TRIM(p_val)= \'\'       然后          返回0;       万一;       选择TO_NUMBER(p_val)         INTO v_val         从双重;       返回1;    例外       当别人       然后          返回0;    结束; 结束; SELECT is_numeric(\'333.5 \')is_numeric   从双重; 我假设您要将空值/空值视为FALSE。     
正如汤姆·凯特(Tom Kyte)在http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:7466996200346537833中指出的那样,如果您在用户定义的函数,可能需要一些额外的技巧才能使其起作用。
FUNCTION is_number(x IN VARCHAR2)
RETURN NUMBER
IS
    PROCEDURE check_number (y IN NUMBER)
    IS
    BEGIN
        NULL;
    END;
BEGIN
    PRAGMA INLINE(check_number, \'No\');
    check_number(TO_NUMBER(x);
    RETURN 1;
EXCEPTION
    WHEN INVALID_NUMBER
    THEN RETURN 0;
END is_number;
问题在于,优化编译器可能会认识到ѭ2the的结果未在任何地方使用并对其进行优化。 汤姆说(他的例子是关于日期而不是数字):   禁用函数内联将使其执行对   将check_date作为函数调用进行-以便   必须将DATE推送到调用堆栈中。没有机会   在这种情况下,优化编译器以删除对to_date的调用。如果   调用check_date所需的to_date调用失败   原因,我们知道在该日期之前字符串输入不可转换   格式。     
这是一种确定数值的方法,可以将其作为简单查询的一部分,而无需创建函数。解释嵌入式空格,+-不是第一个字符或第二个小数点。
var v_test varchar2(20);
EXEC :v_test := \' -24.9 \';

 select
 (case when trim(:v_test) is null then \'N\' ELSE   -- only banks, or null
 (case when instr(trim(:v_test),\'+\',2,1) > 0 then \'N\' ELSE  -- + sign not first char
 (case when instr(trim(:v_test),\'-\',2,1) > 0 then \'N\' ELSE  -- - sign not first char
 (case when instr(trim(:v_test),\' \',1,1) > 0 then \'N\' ELSE  -- internal spaces
 (case when instr(trim(:v_test),\'.\',1,2) > 0 then \'N\' ELSE  -- second decimal point
 (case when LENGTH(TRIM(TRANSLATE(:v_test, \' +-.0123456789\',\' \'))) is not null then \'N\' ELSE  -- only valid numeric charcters.
  \'Y\'
  END)END)END)END)END)END) as is_numeric
  from dual;
    
我发现解决方法
LENGTH(TRIM(TRANSLATE(string1, \' +-.0123456789\', \' \'))) is null
允许嵌入空格...它接受\“ 123 45 6789 \”,对我而言,它不是数字。 修剪/翻译的另一个级别可以纠正这一问题。以下内容将检测包含连续数字的字符串字段,该数字字段带有前导或尾随空格,从而to_number(trim(string1))不会失败
LENGTH(TRIM(TRANSLATE(translate(trim(string1),\' \',\'X\'), \'0123456789\', \' \'))) is null
    
对于整数,可以使用以下内容。第一个转换将空格更改为字符,第二个转换将数字更改为空格。如果只有数字,则Trim将返回null。
TRIM(TRANSLATE(TRANSLATE(TRIM(\'1 2 3d 4\'), \' \',\'@\'),\'0123456789\',\' \')) is null
    

要回复问题请先登录注册