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.