Mysql Varchar/Text Feld auf Zahl als Inhalt prüfen

Alain Aubert

Legendäres Mitglied
Ich suche
SQL select * from table where is_int(reason)

um die Zeilen zu holen, welche eine Zahl (und genau eine Zahl) in einem Varchar Feld enthält.

Irgendwie steh ich aber auf dem Schlauch, kann mich nicht an die ensprechende Fkt erinnern und finde sie in der Manual nicht.

Also dachte ich, frag ich mal euch
wink.gif


Gelöst hab ich es dann einfach mit abs(reason)>0; allerdings weiss ich nicht, wie Mysql mit abs(String) oder abs(null) umgeht (ich vermute 0 und null). Macht genau das was ich wollte, aber frustriert mich, dass den Namen der Mysql Funktion nicht gefunden habe.

PS:
QUOTE (ich vermute 0 und null)

Vermute, Vermutung ist korrekt. Allerdings abs(String) ist >0 sobald String irgendetwas beinhaltet, was sich als Nümmerchen casten lässt.
 
Ich wüsste dafür momentan auch nur REGEXP bzw. RLIKE...

zB:
CODE select * from table where reason RLIKE '^[0-9]+$'


Weiß nicht ob MySQL auch die shortcuts für Characterklassen macht, dann könnte man auch \d nehmen
 
Am Wochenende hatte ich mir für diesen Thread eine mySql-Hilfe runtergeladen.

Das kennt nicht die MSSQL-Funktion ISNUMERIC, die 0 oder 1 liefert, auch nichts analoges.

Dafür kann man aber mit RegEx-Ausdrücken so etwas machen:

[:character_class:]

mit

digit

für Ziffernzeichen.

Geschätzt:

CODE Select A.Spalte
From Tabelle As A
Where A.Spalte REGEXP '^[[:digit:]]+$'
 
Danke für eure Antworten. Das Ding gibts also wirklich nicht. Das beruhigt mich, denn in solchen Situationen denk ich, alt zu sein...
Eurer Lösung fehlte in meinem Fall noch die Überprüfung auf führende nullen.
Allerdings war in meinem Fall abs() tatsächlich die beste, weil performanteste Lösung. Mit regexp geh ich grundsätzlich erst zu Werke, wenn die anderen Möglichkeiten ausgeschöpft sind. Meine Lösung war aber nur anwendwar, weil ich wusste, was die obere Schranke der Ints ist, und was in den Feldern drin steht.

QUOTE Weiß nicht ob MySQL auch die shortcuts für Characterklassen macht, dann könnte man auch \d nehmen

Glaube nein, müsste nachschauen
 
QUOTE (Christian Leo @ Mo 11.02.2008, 20:50)WHERE CONVERT(SomeColumn, SIGNED INTEGER) IS NOT NULL

Ich weiß zwar nicht, wie mySql Fehler behandelt.

Aber innerhalb des MSSQL crashen solche Aufrufe, weil die Ausdrücke nicht konvertierbar sind.

Und damit wäre der Zweck verfehlt.

Grade kommt mir eine 'dumme Lösung' ohne RegEx:


QUOTE Select *
From Tabelle
Where Len(... Replace(Replace(Spalte, '0', ''), '1', '') ) = 0


Die Ziffern 0 - 9 einfach ersetzen, zusätzlich wohl '.' - bleibt dann nix übrig, dann muß es eine Zahl sein.

PS: Statt \d diese Konstruktion mit :digit:
 
QUOTE WHERE CONVERT(SomeColumn, SIGNED INTEGER) IS NOT NULL

Hm. Die Funktion hat Mysql definiv auch. Aber imho ist convert("string", signed integer)=0. Also ist die Lösung falsch, der Ansatz aber goldrichtig. is not null => >0 und dann wäre es die korrekte Lösung für mein Problem. Aber jetzt die Frage, was macht der Bruder aus "78459a"?

SQL SELECT convert( "convert Me", signed integer ) AS one, convert( "con 3 m2", signed integer ) AS two, convert( "78459 a", signed integer ) AS tree

=>

CODE one two tree
0 0 78459

Also ist das auch keine Lösung. Wir sind wieder bei dem Regexp.
=>

SQL select * from transfer where reason RLIKE '^[1-9]+[0-9]*$'



QUOTE Ich weiß zwar nicht, wie mySql Fehler behandelt.

query() returned Fehler-Nummer und -Text. Du entscheidest dann was zu tun.


QUOTE Aber innerhalb des MSSQL crashen solche Aufrufe, weil die Ausdrücke nicht konvertierbar sind.

Das würde definiv Mysql nicht crashen, aber auch nicht wie intendiert funktionieren.

Diene "dumme Lösung" hätte mir nicht geholfen, weil es auch Zeilen mit leeren Feldern gibt. Allerdings hätte man mit diesem Ansatz eine Lösung finden können. Also guter Ansatz.

Aber vor diesem Problem werd ich nie wieder stehen, das war nur ne nachträgliche Normalisierungs-Aktion. Wenn man Zahlen reinschreibt, soll man auch Ints draufschreiben.

PS: Oh Christian, Deinen Beitrag hab ich übersehen.

QUOTE Das Problem bei abs() wird sein, dass abs(0) == 0 ist, "0" ist aber dennoch eine Zahl ;-)

Das, und wie erwähnt abs("Du Gurke 34 Himmel")>0
Ich bin mit abs nur so gut gefahren, weil ich die Anzahl Ziffern zusätzlich eingrenzen konnte. Also Hatte das Problem shcon gelöst, als ich den Beitrag hier erstellt. Wollte aber meine Funktion zurück
wink.gif
 
Zurück
Oben