SQL:如果无法将to_number转换为null

mac*_*adu 9 sql oracle

我有一个包含这个值的表:

ID      VALUE
-----------------------
23559   200
23562   -1 & {14376}#-1
Run Code Online (Sandbox Code Playgroud)

我想做一个选择,如果我不能转换为数字设置NULL.

cwa*_*ole 15

我通常使用翻译,因为这是一个奇怪的角落案例:

SELECT 
  CASE
     WHEN TRIM(TRANSLATE(COLUMN_NAME, '1234567890', ' ')) IS NULL THEN NULL
     ELSE COLUMN_NAME
  END AS "NUMERIC_COLUMN"
FROM
  TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)

如果有必要,可以将其转变为程序,但我不确定在性能方面会有多大的好处.

  • 纯转换可能存在非整数数据的问题(即,假设0.99是有效数字但不是0.99.123.4)并且字符串可能包括分组分隔符(即1,000.00可能是有效数字). (3认同)

Jus*_*ave 10

您可以创建一个函数,尝试将字符串转换为数字并捕获异常.就像是

CREATE OR REPLACE FUNCTION my_to_number( p_str IN VARCHAR2 )
  RETURN NUMBER
IS
  l_num NUMBER;
BEGIN
  BEGIN
    l_num := to_number( p_str );
  EXCEPTION
    WHEN others THEN
      l_num := null;
  END;

  RETURN l_num;
END;
Run Code Online (Sandbox Code Playgroud)

然后你可以

SELECT id, my_to_number( value )
  FROM your_table
Run Code Online (Sandbox Code Playgroud)


DCo*_*kie 9

您还可以使用REGEXP_LIKE:

SELECT id
     , CASE WHEN regexp_like(value,'^[0-9]+$') THEN TO_NUMBER(value)
            ELSE NULL
        END value
  FROM your_table;
Run Code Online (Sandbox Code Playgroud)

例如:

SQL> WITH q AS (
  2  SELECT 1 ID, '200' col FROM dual
  3  UNION
  4  SELECT 2, '-1 & {14376}#-1' FROM dual
  5  )
  6  SELECT id, CASE WHEN regexp_like(col,'^[0-9]+$') THEN TO_NUMBER(col) ELSE NULL END TEST FROM q;

        ID       TEST
---------- ----------
         1        200
         2 
Run Code Online (Sandbox Code Playgroud)


a_h*_*ame 5

在 Oracle 12. 2 中,使用以下on conversion error选项可以更轻松地完成此操作:

select id, cast(value as number default null on conversion error) as value
from the_table;
Run Code Online (Sandbox Code Playgroud)

您还可以选择指定格式掩码,类似于该to_number()功能。

我认为这比使用 PL/SQL 函数更快,与使用case正则表达式相比,不确定性能。但它肯定要短得多。