Mit Zahl aus VARCHAR2 Feld rechnen

Hallo liebe WWW-Gemeinde,

ich möchte aus einem VARCHAR(2) Feld aus einem Text/einer Zahl eine Ziffer extrahieren und mit dieser rechnen. Ich habe es unteranderem wie folgt versucht:

  • select cast(substr(p.varcharfeld,4,1) as number) * 5

Wert im Feld „p.varcharfeld“ = ‚456987‘

  • Erwartetes Ergebnis wäre (9*5) = 45

Ich erhalte jedoch immer den Fehler ORA-01722. Hat hier jemand eine Idee?

Um es gleich vorab zu sagen, eine Änderung des Datentyps von VARCHAR(2) auf NUMBER ist nicht möglich, da es in dem Feld auch alphanumerische Werte gibt.

Besten Dank im Voraus für Eure Hilfe/Ideen!

Viele Grüße
Raffael

Hallo!

Zumindest in MySQL ist number kein gültiger Datentyp. Versuch es mal mit int:

MariaDB [(none)]> select cast(substr('456987',4,1) as number) * 5;
ERROR 1064 (42000): You have an error in your SQL syntax; check 
the manual that corresponds to your MariaDB server version for the 
right syntax to use near 'number) * 5' at line 1



MariaDB [(none)]> select cast(substr('456987',4,1) as int) * 5;
+---------------------------------------+
| cast(substr('456987',4,1) as int) * 5 |
+---------------------------------------+
|                                    45 |
+---------------------------------------+
1 row in set (0.08 sec)

Das sieht eher nach einer Oracle-Datenbank als nach MySQL aus. Und Oracle kennt offensichtlich auch number:
http://www.datenbank-sql.de/oracle-datentypen.htm

ORA-01722 steht wohl für invalid number (ungültige Zahl).

Ich habe hier keine Oracle-DB zum Testen. Ginge evtl. so etwas?
select to_number(substr(p.varcharfeld,4,1)*5;

Gruß
Christa

Hi!

Ich habe gerade beides (also deine und meine mir als erstes in den Sinn gekommene Version) probiert - und beides funktioniert:
Dein

select cast(substr(‚456987‘,4,1) as number)*5 from dual;

funktioniert genauso wie mein

select to_number(substr(‚456987‘,4,1))*5 from dual;

Also passt irgendwas mit der Zuweisung nicht (unter Oracle sollte schon „:=“ bei der Zuweisung stehen, also

oder irgendwas anderes passt nicht.

Grüße,
Tomh

@sweber
Vielen Dank für die Idee. Hat leider nicht geklappt.

In der Tat habe ich vergessen zu schreiben, dass es sich um Oracle 12 Datenbank handelt.

@Christa
Die Funktion to_number hatte ich auch schon probiert. Klappt leider auch nicht. Auch hier bekomme ich den Fehler ORA-01722.

@Tomh
Konnte den Check via from dual bei mir auch nachstellen, es klappt. Dann habe ich an dieser Stelle also doch nicht ganz falsch gedacht.

Was die von Dir erwähnte Zuweisung angeht, hier wollte ich nur klarstellen, was im Datenbankfeld „p.varchardfeld“ steht. An sich sieht der relevante Ausdruck bei mir im SQL Script so aus:

  • select to_number(substr(p.varcharfeld,4,1))*5
    from schema.tabelle_p01 p
    where p.feld1 = ‚XXX‘
    and p.feld2 = ‚YYY‘

Das Feld p.varchardfeld hat den Datentyp VARCHAR2.

Habe den Fehler gefunden :blush:

Bei der Bedingung welche Datensätze ich berücksichtigen möchte habe ich nicht klar genug definiert, dass ich ausschließlich Datensätze verwenden möchte, die an besagter Stelle eine Ziffer haben.

Verwende nun folgende Eingrenzung. So werden nur die Datensätze herangezogen, die in dem Feld eine 10stellige Nummer stehen haben.

REGEXP_LIKE(p.varcharfeld), ‚^\d{10}‘)

Danke Euch allen für den Gedankenaustausch. So bin ich auf die Lösung gekommen.

Dass das FROM fehlt, hatte ich komplett übersehen, wie peinlich! :sob: