Wenn Sie Ihre Sitzung, dass Fehler aus einem String wie 13.5
dann NLS_NUMERIC_CHARACTERS scheint, wenn es darum zu setzen ein Komma als das verwenden, Dezimaltrennzeichen:
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
Sie können entweder explizit die Sitzung festgelegt einen Punkt als Dezimaltrennzeichen zu verwenden, oder eine Formatmaske bereitzustellen, die einen Zeitraum verwendet:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Oder das Dezimaltrennzeichen Marker im Modell verwenden und die NLS-Einstellung Sitzung außer Kraft setzen:
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
'99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;
SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
35,5
Die Maske hat offensichtlich für alle Werte geeignet sein, Sie wieder von Ihrem regex erwarten; Was ich verwendet habe, ist möglicherweise nicht ganz richtig für Ihre Daten.
Diese Art von Problem ist, warum Sie Zahlen oder Daten nicht als Zeichenfolgen speichern sollten. Verwenden Sie den richtigen Datentyp für Ihre Spalten.
Warum brauchen Sie das regexp_replace? Das bedeutet, dass "X1X2X3X4XX" 1234 sein wird. Wollen Sie das wirklich? – Aleksej
Wofür sind 'nls_numeric_characters' eingestellt? –
*** Speichern Sie niemals Zahlen in 'Varchar'-Spalten. Fixieren Sie stattdessen Ihr Tischdesign. –