Ich habe ein 20stelliges Characterfeld.
Davon möchte ich die ersten 10 Stellen auf numerisch abfragen.
Weiss jemand, wie das funktioniert?
Vielen Dank für Hilfe!!!
Grüße
Carolin
Ich habe ein 20stelliges Characterfeld.
Davon möchte ich die ersten 10 Stellen auf numerisch abfragen.
Weiss jemand, wie das funktioniert?
Vielen Dank für Hilfe!!!
Grüße
Carolin
hi!
noch mehr information (welches datenbanksystem?) würde uns sicher nicht allzusehr verwirren
grüße,
tomh
DB2 von IBM, denke aber
das der Befehlssyntax überall gleich sein dürfte…
Vielen Dank für Unterstützung!!!
Grüße
Carolin
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Eine Abfrage wie z.B. in COBOL „IS NUMERIC“ gibt es im ANSI-SQL nicht. (und DB2 hält sich eigendlich recht nah an den Standard)
Eine Lösung, die mir einfällt ist ein zeichenweiser Vergleich mit einer Liste erlaubter Zeichen:
SELECT ...
FROM ...
WHERE
SUBSTR(Feld, 1,1) IN ('0','1','2','3','4',
'5','6','7','8','9')
AND SUBSTR(Feld, 2,1) IN ('0','1','2','3','4',
'5','6','7','8','9')
AND SUBSTR(Feld, 3,1) IN ('0','1','2','3','4',
'5','6','7','8','9')
AND SUBSTR(Feld, 4,1) IN ('0','1','2','3','4',
'5','6','7','8','9')
u.s.w.
AND SUBSTR(Feld,20,1) IN ('0','1','2','3','4',
'5','6','7','8','9')
Eine schönene Lösung ist folgende:
SELECT ...
FROM ...
WHERE
TRANSLATE(Feld,'x ',' 1234567890') = ' '
Hier werden alle Zahlen in BLANK umgesetzt und alle BLANKs in „x“.
War der Wert vorher numerisch steht dann nur noch BLANK drin.
Wenn BLANK auch erlaubt ist, dann einfach das „x“ durch BLANK tauschen.
In deinem Fall mußt du auch noch „Feld“ durch „SUBSTR(Feld,1,20)“ ersetzen.
Gruß,
Darkwing ^v^
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
hi
also, abgesehen davon, das es a blöde aufgabe ist, würde ich es in oracle so formulieren
vielleicht gibt es ja da in der db2 eine andere möglichkeit, aber in oracle kannst auch nicht’s mit einem to_number oder so anfangen weil der auf einen fehler aufläuft wenn es nur 10 ziffern sind.
select feld from table
where substr(translate (feld, ‚0123456789‘,’^^^^^^^^^^’),1,10)=’^^^^^^^^^^’
ciao
christian
Deine Lösung ist gut (sieht ja auch fast so aus wie meine )
Es geht allerdings schneller, wenn der SUBSTR um das „feld“ und nicht um das „translate“ gelegt wird. Sonst wird erst das gesamte Feld umgewandelt und dann vor dem Vergleich abgeschnitten.
So wird erst abgeschnitten, dann umgewandelt und dann verglichen.
Gruß,
Darkwing ^v^
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Mal angenommen…
es handelt sich bei den zeichen nur um zahlen und buchstaben
dann würde auch folgender script funktionieren
select feld from test
where lower(substr(feld,1,10)) = upper(substr(feld,1,10))
sogar den substring in der funktion:smile:
christian
hi!
oder die brutale lösung in pl/sql:
…
declare
x number;
begin
x := to_number(substr(feld,1,10));
…
exception
when OTHERS then --mir fällt grad die genaue value-error bezeichnung nicht ein
– KEINE NUMMER
end;
…
grüße,
tomh
hi
when INVALID_NUMBER then
shutdown abort;
rm -f $ORACLE_HOME
christian
Danke! Aber nicht verstanden…
Kannst du mir das nochmal bitte versuchen anders zu erklären?
Danke!!!
Grüße
Carolin
Eine schönene Lösung ist folgende:
SELECT …FROM …WHERE TRANSLATE(Feld,‚x ‚,‘ 1234567890‘) = ’ ’
Hier werden alle Zahlen in BLANK umgesetzt und alle BLANKs in „x“.
War der Wert vorher numerisch steht dann nur noch BLANK drin.
Wenn BLANK auch erlaubt ist, dann einfach das „x“ durch BLANK tauschen.
In deinem Fall mußt du auch noch „Feld“ durch „SUBSTR(Feld,1,20)“ ersetzen.
Auch hier, Sorry aber nicht verstanden…
Kannst du mir das nochmal bitte versuchen anders zu erklären?
Danke!!!
Grüße
Carolin
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
once more with feeling…
Kannst du mir das nochmal bitte versuchen anders zu erklären?
Eine schönene Lösung ist folgende:
SELECT …
FROM …
WHERE
TRANSLATE(SUBSTR(Feld,1,20),‚x ‚,‘ 1234567890‘) = ’ ’
OK. Dann versuche ich das mal Schritt für Schritt zu erklären:
Die Aufgabe war, in einem Feld zu prüfen, ob die ersten 20 Stellen numerisch sind.
Die Funktion SUBSTR(Feld,1,20) schneidet zunächst aus deinem zu prüfenden Feld die Stellen 1-20 heraus. Nur die sind ja für uns interessant.
Die Funktion TRANSLATE(Feld,‚x ‚,‘ 1234567890‘) wandelt alle Zeichen aus dem 2. String in das jeweilige Zeichen des 1. Strings (an gleicher Position) um. In diesem Fall wird also umgewandelt:
’ ’ -> ‚x‘
‚1‘ -> ’ ’
‚2‘ -> ’ ’
‚3‘ -> ’ ’
‚4‘ -> ’ ’
‚5‘ -> ’ ’
‚6‘ -> ’ ’
‚7‘ -> ’ ’
‚8‘ -> ’ ’
‚9‘ -> ’ ’
‚0‘ -> ’ ’
Damit würde, wenn in dem Feld nur Ziffern stehen, nach dem TRANSLATE nur noch BLANKs stehen. Damit wir aber unterscheiden können, ob schon vorher BLANKs dort gestanden haben werden diese in ‚x‘ umgesetzt.
Beispiel:
Feld ! TRANSLATE(Feld,'x ',' 1234567890')
--------------------+--------------------+---------
00001020304050607080! !
0 1 2 3 4 5 6 7 8 9 ! x x x x x x x x x x!
1234567890!xxxxxxxxxx !
Wie du siehst sind also nur rein numerische Felder nacher komplett BLANK.
Wenn du noch weitere Fragen hast, schick mir einfach eine eMail.
Gruß,
Darkwing ^v^
Super, Tipp, vielen Dank!!!
Funktioniert prächtig…
Grüße
Carolin
Funktioniert nicht,
da auch Werte wie ‚1Hallo11111‘ selektiert werden.
Trotzdem Danke!
Grüße
Carolin
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
hi!
ich würd auf nummer sicher gehn:
kill -9 den ora_smon-prozess
kill -9 den ora_pmon-prozess
…
grüße,
tomh
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]