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.
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)
@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.
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.