Oracle
 sql >> Base de données >  >> RDS >> Oracle

Impossible de SUM(TO_NUMBER(champ varchar2)) :ORA 01722 [ORACLE]

Si vous obtenez cette erreur à partir d'une chaîne telle que 13.5 puis le NLS_NUMERIC_CHARACTERS semble être configuré pour utiliser une virgule comme séparateur décimal :

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

Vous pouvez soit configurer explicitement la session pour qu'elle utilise un point comme séparateur décimal, soit fournir un masque de format qui utilise un point :

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

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

Ou utilisez le séparateur décimal dans le modèle et remplacez le paramètre NLS de la session :

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

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

Le masque doit évidemment convenir à toutes les valeurs que vous attendez de votre regex ; ce que j'ai utilisé n'est peut-être pas tout à fait adapté à vos données.

Ce type de problème explique pourquoi vous ne devez pas stocker de nombres ou de dates sous forme de chaînes. Utilisez le type de données correct pour vos colonnes.