Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kann nicht SUM(TO_NUMBER(varchar2 field)) :ORA 01722 [ORACLE]

Wenn Sie diesen Fehler von einer Zeichenfolge wie 13.5 erhalten dann die NLS_NUMERIC_CHARACTERS Ihrer Sitzung scheint so eingestellt zu sein, dass ein Komma als Dezimaltrennzeichen verwendet wird:

alter session set nls_numeric_characters=',.';

with your_table (bikou) as (
  select '10' from dual
  union all select '12' from dual
  union all select '13.5' from dual
  union all select null from dual
)
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', '')))
from your_table;

SQL Error: ORA-01722: invalid number

Sie können die Sitzung entweder explizit so einstellen, dass ein Punkt als Dezimaltrennzeichen verwendet wird, oder eine Formatmaske bereitstellen, die einen Punkt verwendet:

select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;

SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
                                   35,5

Oder verwenden Sie das Dezimaltrennzeichen im Modell und überschreiben Sie die NLS-Einstellung der Sitzung:

select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
  '99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;

SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
                                   35,5

Die Maske muss natürlich für alle Werte geeignet sein, die Sie von Ihrer Regex erwarten; Was ich verwendet habe, ist möglicherweise nicht ganz richtig für Ihre Daten.

Diese Art von Problem ist der Grund, warum Sie Zahlen oder Datumsangaben nicht als Zeichenfolgen speichern sollten. Verwenden Sie den richtigen Datentyp für Ihre Spalten.