Problem statement: From a given set in a column of a character data type, select only rows containing numeric values.
SQL> create table t1 ( c1 varchar2(100)); Table created.
SQL> insert into t1 (c1) values ('123'); 1 row created. SQL> insert into t1 (c1) values (null); 1 row created. SQL> insert into t1 (c1) values ('$$$'); 1 row created. SQL> commit; Commit complete.
Option 1. Conversional functions
From Oracle version 12.2 there are functions CAST or TO_NUMBER with default value on conversion error
SQL> select cast(c1 as number default 0 on conversion error) from t1 2 where cast(c1 as number default 0 on conversion error) <> 0; CAST(C1ASNUMBERDEFAULT0ONCONVERSIONERROR) ----------------------------------------- 123
Option 2. VALIDATE_CONVERSION function
Even more easier, for select / validate only numbers. The function returns 1 if conversion is successful or 0 if it failed.
SQL> select c1 from t1 where validate_conversion(c1 as number) = 1; C1 ---------- 123
Inspired by article Conversion Function Enhancements in Oracle Database 12c Release 2
https://oracle-base.com/articles/12c/conversion-function-enhancements-12cr2