Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não é possível SUM(TO_NUMBER(campo varchar2)) :ORA 01722 [ORACLE]


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.