2016-05-27 6 views
-1

Ich habe myfield als varchar2 Typ und ich versuche, dieses Feld summieren (to_number (myfield)), aber das Ergebnis ist ORA-01722 ungültige Nummer.Kann nicht SUMME (TO_NUMBER (varchar2 Feld)): ORA 01722 [ORACLE]

bevor dieser Fehler aufgetreten ist habe ich SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''))) verwendet und es funktioniert, aber letzte Woche habe ich einen Dezimalwert in myfield gesetzt, damit dieser Code nicht mehr funktioniert.

Hier ist mein Beispiel von Daten in myfield 10,12,13.5, NULL

+0

Warum brauchen Sie das regexp_replace? Das bedeutet, dass "X1X2X3X4XX" 1234 sein wird. Wollen Sie das wirklich? – Aleksej

+0

Wofür sind 'nls_numeric_characters' eingestellt? –

+1

*** Speichern Sie niemals Zahlen in 'Varchar'-Spalten. Fixieren Sie stattdessen Ihr Tischdesign. –

Antwort

2

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.