Jeśli otrzymujesz ten błąd z ciągu, takiego jak 13.5
następnie NLS_NUMERIC_CHARACTERS
sesji wydaje się, że używa przecinka jako separatora dziesiętnego:
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
Możesz albo jawnie ustawić sesję, aby używała kropki jako separatora dziesiętnego, albo podać maskę formatu, która używa kropki:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Lub użyj znacznika separatora dziesiętnego w modelu i zastąp ustawienie NLS sesji:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
'99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Maska oczywiście musi być odpowiednia dla wszystkich wartości, których oczekujesz od swojego wyrażenia regularnego; to, czego użyłem, może nie pasować do Twoich danych.
Ten rodzaj problemu powoduje, że nie powinieneś przechowywać liczb ani dat jako ciągów. Użyj prawidłowego typu danych dla swoich kolumn.