我有一个包含这个值的表:
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)
如果有必要,可以将其转变为程序,但我不确定在性能方面会有多大的好处.
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)
您还可以使用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)
在 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正则表达式相比,不确定性能。但它肯定要短得多。