Anzeige - [Interessiert an einer Anzeige?]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
> Mysql Varchar/Text Feld auf Zahl als Inhalt prüfen, is_int für mysql
Alain_Aubert
Geschrieben am: Mo 11.02.2008, 17:08
Report PostQuote Post

Ayom Slave
Group Icon

Gruppe: Admin
Beiträge: 4794
Mitglied seit: 25.09.2003


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.
Top
PMEmail PosterUsers Website
Top
 
 
Maik
power-labels AG
#2 Geschrieben am: Mo 11.02.2008, 18:50 (+01:41)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 479
Mitglied seit: 16.03.2006


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


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#3 Geschrieben am: Mo 11.02.2008, 20:30 (+01:39)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2299
Mitglied seit: 4.02.2006


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:]]+$'


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - die Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
faris
#4 Geschrieben am: Mo 11.02.2008, 20:50 (+00:20)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 154
Mitglied seit: 16.02.2006


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

Edit: Gerade gefunden:
WHERE CONVERT(SomeColumn, SIGNED INTEGER) IS NOT NULL

oder gleich selbst eine Funktion schreiben: http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
Top
PMEmail Poster
Top
 
Alain_Aubert
#5 Geschrieben am: Mo 11.02.2008, 20:56 (+00:06)
Report PostQuote Post

Ayom Slave
Group Icon

Gruppe: Admin
Beiträge: 4794
Mitglied seit: 25.09.2003


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
Top
PMEmail PosterUsers Website
Top
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#6 Geschrieben am: Mo 11.02.2008, 21:14 (+00:17)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2299
Mitglied seit: 4.02.2006


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:


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - die Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
Alain_Aubert
#7 Geschrieben am: Mo 11.02.2008, 21:43 (+00:29)
Report PostQuote Post

Ayom Slave
Group Icon

Gruppe: Admin
Beiträge: 4794
Mitglied seit: 25.09.2003


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
Top
PMEmail PosterUsers Website
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/22945

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
Kaufen ein deutsche Website/Domain oder Text Link günter31 257 6 Fr 10.10.2008, 09:21
Suche Freelancer: Ajax, XML, PHP, MySQL omc 146 2 Mo 6.10.2008, 20:14
Lösung für: Content Slider-Java Script-PHP-MySql Antoine Johannes 122 2 Fr 26.09.2008, 12:54
[S] Text. Thema SEO Thomas G. 85 0 Mo 22.09.2008, 12:30
[B] Text über Rechtschutz-Versicherungen sylvia73 84 0 Sa 20.09.2008, 16:29
Pagerank 4 mit Null inhalt? lordoliver 715 17 Sa 20.09.2008, 14:08
PHP + MySQL 2 Fragen an euch Coach 152 1 Do 18.09.2008, 10:52
Guter Anbieter für Text/Bannerwerbung gesucht fluchen_net 293 9 Mo 15.09.2008, 17:17
PHP und MySQL Probleme Swisstiger 500 4 So 14.09.2008, 22:23
Von Datetime Feld nur Date anzeigen retok 160 4 Sa 13.09.2008, 18:31




Anzeige - [Interessiert an einer Anzeige?]



Anzeigen


[Interessiert an einer Anzeige?]