sql >> Databasteknik >  >> RDS >> Oracle

Kan inte SUMMA(TO_NUMBER(varchar2-fält)) :ORA 01722 [ORACLE]

Om du får det felet från en sträng som 13.5 sedan din sessions NLS_NUMERIC_CHARACTERS verkar vara inställd på att använda ett kommatecken som decimalavgränsare:

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

Du kan antingen uttryckligen ställa in sessionen att använda en punkt som decimalavgränsare eller tillhandahålla en formatmask som använder en punkt:

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

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

Eller använd decimalavgränsaren i modellen och åsidosätt sessionens NLS-inställning:

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

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

Masken måste självklart vara lämplig för alla värden du förväntar dig tillbaka från ditt regex; det jag har använt kanske inte är helt rätt för din data.

Den här typen av problem är varför du inte bör lagra siffror eller datum som strängar. Använd rätt datatyp för dina kolumner.




  1. CONCAT() Funktion i Oracle

  2. Hur INTE REGEXP fungerar i MySQL

  3. SQLSTATE[22007]:Ogiltigt datetime-format:1292 Felaktigt datetime-värde:'2008-03-30 02:56:12'

  4. Inloggning misslyckades för användaren 'DOMAIN\MACHINENAME$'