[Oracle] Enthält String-Feld eine Nummer ?

Hallo
Wie kann man (für eine WHERE-Bedingung) testen, ob ein String-Feld eine Ganzzahl enthält ?

Habe in der Oracle 10-Doku keine Funktion gefunden…

Hallo,

du kannst eine Funktion dafür schreiben:

CREATE OR REPLACE FUNCTION is_number(char_in VARCHAR2) RETURN BOOLEAN IS
n NUMBER;
BEGIN
n := TO_NUMBER(char_in);
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END is_number;
/

Gruß

Peter

Hallo
Wie kann man (für eine WHERE-Bedingung) testen, ob ein
String-Feld eine Ganzzahl enthält ?

Habe in der Oracle 10-Doku keine Funktion gefunden…

Hi!

CREATE OR REPLACE FUNCTION is_number(char_in VARCHAR2) RETURN
BOOLEAN IS
n NUMBER;
BEGIN
n := TO_NUMBER(char_in);
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END is_number;
/

Nette Funktion um zu ermitteln, ob char_in eine Zahl ist, jedoch um zu checken, ob’s GANZzahlig ist, würde ein MOD(to_number(char_in),1)=0 reichen (oder es gibt noch ca. 84 Fantastilliarden Möglichkeiten, um dies mithilfe von anderen Funktionalitäten festzustellen)

Grüße,
Tomh

PS: Ich glaub, die obige Funktion existiert mind. einmal pro Applikation - warum hat sich Oracle noch nicht aufgerafft, dafür (auch für Datum usw) eine Extra-Funktionalität anzubieten?

Hallo Peter,

kann man das Ergebnis deiner Funktion in einem SQL-Statement in der WHERE-Klausel benutzen? Ich dachte immer, boolean funzt nur innerhalb PL/SQL? Hat sich das mittlerweile geändert oder bin ich falsch verschaltet und sollte langsam mal 'nen Morgenkaffee trinken?

Leider habe ich keine DB zur Hand, sonst würd’ ich’s selbst testen.

Bitte klär’ mich (oder uns, falls es andere interessiert) auf.

Grüße,
Guido

Hallo Guido,

du hast natürlich recht. Aber man kann die Funktion ganz einfach so verändern, dass sie funktioniert. (Im Grunde muss man nur BOOLEAN durch NUMBER und TRUE durch 1 und FALSE durch 0 ersetzen. Dann sollte es immer und überall klappen.

Ich habe noch eine Variante im Netz gefunden:

FUNCTION is_number(char_in VARCHAR2) RETURN NUMBER IS

BEGIN
FOR x IN 1 … LENGTH(char_in)
LOOP
– remove , & .
IF SUBSTR(char_in,x,1) in (’,’ , ‚.‘ , ’ ') THEN
RETURN 0;
END IF;
END LOOP;

IF TO_NUMBER(char_in,‚9999999‘) > -1000000 THEN
RETURN 1 ;
END IF;
EXCEPTION
WHEN invalid_number THEN
RETURN 0;
WHEN OTHERS THEN
RETURN 0;
END is_number;
/

Man kann da noch beliebige Variationen mit Dezimal und Tausender-Trennzeichen und Exponentialdarstellung und verschiedenen Typen machen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

primitiv aber einfach
hi alle zusammen

ich verwende gern folgenden kniff:

select *
from tabelle
where translate (feld,’.0123456789’,’.’) is null ;

liefert alle datensätze, bei denen in feld ausschließlich ziffern sind.

funktioniert natürlich nicht bei kommastellen, negativen zahlen und sonstigen formatierungszeichen, reicht aber bei simplen prüfungen, wo die möglichen zahlenformate bekannt sind.

lg
erwin