sql >> Database >  >> RDS >> Oracle

Cannot SUM(TO_NUMBER(varchar2 field)) :ORA 01722 [ORACLE]

Als je die fout krijgt van een tekenreeks zoals 13.5 dan is uw sessie NLS_NUMERIC_CHARACTERS lijkt te zijn ingesteld om een ​​komma als decimaal scheidingsteken te gebruiken:

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

U kunt de sessie expliciet instellen om een ​​punt als decimaalteken te gebruiken, of u kunt een opmaakmasker opgeven dat een punt gebruikt:

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

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

Of gebruik de decimaaltekenmarkering in het model en overschrijf de NLS-instelling van de sessie:

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

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

Het masker moet uiteraard geschikt zijn voor alle waarden die je terug verwacht van je regex; wat ik heb gebruikt, is misschien niet helemaal geschikt voor je gegevens.

Dit soort problemen is de reden waarom u getallen of datums niet als strings moet opslaan. Gebruik het juiste gegevenstype voor uw kolommen.




  1. Vervaldatum Oracle-gebruikerswachtwoord wijzigen

  2. Rechtstreeks toegang krijgen tot een SQL Server-database in Xamarin.Forms

  3. Windows kan 'http://.127.0.0.1:%HTTPPORT%/apex/f?p=4950' niet vinden. Zorg ervoor dat u de naam correct hebt getypt en probeer het opnieuw

  4. Hoe tekst te scheiden met behulp van subtekenreeks