Se você está recebendo esse erro de uma string como
13.5
então o NLS_NUMERIC_CHARACTERS
da sua sessão parece estar definido para usar uma vírgula como separador decimal: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
Você pode definir explicitamente a sessão para usar um ponto como separador decimal ou fornecer uma máscara de formato que use um ponto:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Ou use o marcador separador decimal no modelo e substitua a configuração NLS da sessão:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
'99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
A máscara obviamente deve ser adequada para todos os valores que você espera de sua regex; o que eu usei pode não ser muito adequado para seus dados.
Esse tipo de problema é o motivo pelo qual você não deve armazenar números ou datas como strings. Use o tipo de dados correto para suas colunas.