Oracle
 sql >> Database >  >> RDS >> Oracle

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

Se ricevi quell'errore da una stringa come 13.5 quindi NLS_NUMERIC_CHARACTERS della tua sessione sembra essere impostato per utilizzare una virgola come separatore decimale:

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

Puoi impostare esplicitamente la sessione in modo che utilizzi un punto come separatore decimale o fornire una maschera di formato che utilizzi un punto:

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

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

Oppure usa l'indicatore di separazione decimale nel modello e sovrascrivi l'impostazione NLS della sessione:

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

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

La maschera ovviamente deve essere adatta a tutti i valori che ti aspetti dalla tua regex; quello che ho usato potrebbe non essere adatto ai tuoi dati.

Questo tipo di problema è il motivo per cui non dovresti memorizzare numeri o date come stringhe. Utilizza il tipo di dati corretto per le tue colonne.