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.