Hvis du får den fejl fra en streng som 13.5
derefter din sessions NLS_NUMERIC_CHARACTERS
ser ud til at være indstillet til at bruge et komma som decimalseparator:
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 enten udtrykkeligt indstille sessionen til at bruge et punktum som decimalseparator eller angive en formatmaske, der bruger et punktum:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Eller brug decimalseparatormarkøren i modellen og tilsidesæt sessionens NLS-indstilling:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
'99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Masken skal naturligvis være egnet til alle de værdier, du forventer tilbage fra dit regex; Det, jeg har brugt, er måske ikke helt rigtigt for dine data.
Denne form for problem er, hvorfor du ikke bør gemme tal eller datoer som strenge. Brug den korrekte datatype til dine kolonner.