sql >> Base de Datos >  >> RDS >> Oracle

No se puede SUMAR (TO_NUMBER (campo varchar2)):ORA 01722 [ORACLE]

Si obtiene ese error de una cadena como 13.5 entonces los NLS_NUMERIC_CHARACTERS de su sesión parece estar configurado para usar una coma 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

Puede configurar explícitamente la sesión para que use un punto como separador decimal o proporcionar una máscara de formato que use un punto:

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

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

O use el marcador de separador decimal en el modelo y anule la configuración NLS de la sesión:

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

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

La máscara obviamente tiene que ser adecuada para todos los valores que espera de su expresión regular; lo que he usado puede no ser del todo adecuado para sus datos.

Este tipo de problema es la razón por la que no debe almacenar números o fechas como cadenas. Utilice el tipo de datos correcto para sus columnas.