66
SELECT TO_NUMBER('*') FROM DUAL

これは明らかに私に例外を与えます:

ORA-01722: 番号が無効です

それを「スキップ」して、0またはNULL代わりに取得する方法はありますか?

全体の問題:NVARCHAR2数字を含むフィールドがあり、ほとんどではない ;-) (のように*) で、列から最大の数字を選択する必要があります。

はい、私はそれがひどいデザインであることを知っていますが、これは私が今必要としているものです... :-S

更新日:

私自身のために、私はこの問題を解決しました

COALESCE(TO_NUMBER(REGEXP_SUBSTR(field, '^\d+')), 0)
4

9 に答える 9

30
COALESCE(TO_NUMBER(REGEXP_SUBSTR(field, '^\d+(\.\d+)?')), 0) 

また、スケール > 0 (小数点の右側の数字) の数値も取得します。

于 2013-04-26T21:18:49.020 に答える
15

これより良いものは見つかりませんでした:

function safe_to_number(p varchar2) return number is
    v number;
  begin
    v := to_number(p);
    return v;
  exception when others then return 0;
end;
于 2010-12-20T04:56:32.377 に答える
12
select COALESCE(TO_NUMBER(REGEXP_SUBSTR( field, '^(-|+)?\d+(\.|,)?(\d+)?$')), 0) from dual;

123123に変換しますが、123aまたは12a30に変換します。

于 2014-06-25T03:44:50.217 に答える
7

元の質問とかなり古い学校に適合

select a, decode(trim(translate(b,'0123456789.',' ')),null,to_number(b),0)  from 
(
    select '1' a, 'not a number' b from dual
    union
    select '2' a, '1234' b from dual
)
于 2010-12-20T17:11:59.137 に答える
1

数値をテストするために独自の正規表現をローリングするのはおそらく少し面倒ですが、以下のコードは機能する可能性があります。組み込みのOracle機能を使用しているため、ユーザー定義関数を含むGabeによる他のソリューションはより堅牢だと思います(そして、私の正規表現はおそらく100%正しいとは限りません)が、試してみる価値があるかもしれません:

with my_sample_data as (
  select '12345' as mynum from dual union all
  select '54-3' as mynum from dual union all
  select '123.4567' as mynum from dual union all
  select '.34567' as mynum from dual union all
  select '-0.3462' as mynum from dual union all
  select '0.34.62' as mynum from dual union all
  select '1243.64' as mynum from dual 
)
select 
  mynum, 
  case when regexp_like(mynum, '^-?\d+(\.\d+)?$') 
    then to_number(mynum) end as is_num
from my_sample_data

これにより、次の出力が得られます。

MYNUM   IS_NUM
-------- ----------
12345   12345
54-3    
123.4567    123.4567
.34567  
-0.3462 -0.3462
0.34.62 
1243.64 1243.64
于 2010-12-20T16:22:37.007 に答える
1
select DECODE(trim(TRANSLATE(replace(replace(A, ' '), ',', '.'), '0123456789.-', ' ')),
              null,
              DECODE(INSTR(replace(replace(A, ' '), ',', '.'), '.', INSTR(replace(replace(A, ' '), ',', '.'), '.') + 1),
                     0,
                     DECODE(INSTR(replace(replace(A, ' '), ',', '.'), '-', 2),
                            0,
                            TO_NUMBER(replace(replace(A, ' '), ',', '.'))))) A
  from (select '-1.1' A from DUAL union all select '-1-1' A from DUAL union all select ',1' A from DUAL union all select '1..1' A from DUAL) A;

このコードは、-1-1、1..1、12-2 などの文字列を除外します。ここでは正規表現を使用していません。

于 2014-09-03T06:42:14.743 に答える