mysql, Select Abfrage varchar als Integer behandeln
Anna
- datenbank
- mysql
0 Der Martin0 Rolf B
Ich habe in einer Spalte meiner mysql Tabelle verschiedene Werte
01021
00212
02122
diese möchte ich in einer SELECT Abfrage mittels WHERE ausgeben.
... WHERE spalte>=1021 ....
da die Spalte aber keine integer ist geht es nicht. Wenn ich die Spalte aber in Integer umwandele verliere ich die Formatierung mit den Nullen
Weis hier jemand Abhilfe
Anna
Hallo,
Ich habe in einer Spalte meiner mysql Tabelle verschiedene Werte
spalte --------- 01021 00212 02122
diese möchte ich in einer SELECT Abfrage mittels WHERE ausgeben.
ich ahne etwas ...
... WHERE spalte>=1021 ....
da die Spalte aber keine integer ist geht es nicht. Wenn ich die Spalte aber in Integer umwandele verliere ich die Formatierung mit den Nullen
Genau das habe ich mir gedacht.
Weis hier jemand Abhilfe
Dein Ansatz ist falsch. Sind das tatsächlich Zahlenwerte, wie es der oben angedeutete Vergleich nahelegt? Dann solltest du sie auch tatsächlich als Zahlenwerte speichern (z.B. Integer). Dann sind auch Vergleiche kein Problem. Die Aufbereitung, also das Auffüllen mit führenden Nullen bis zu einer bestimmten Stellenzahl, ist dann Sache der Ausgabe.
Einen schönen Tag noch
Martin
Das das noch zu meinem Problem wir habe ich mir gedacht.
Wenn ich also die VAR in integer umwandele, werden mir die NULLer am Anfang fehlen.
Aber wie kann ich eine Integer Zahle ich bestimmte Teile zerlegen, wie es mit einem String dann geht?
Wenn ich als meine Zahl nehme:
02!122 und sie bei ! trenne, wie bekomme ich das hin
erst wird ja nach der Umwandlung die NUll weg kommen.
2122
Dann müsste ich 2!122 trennen, kann ich sagen abschneiden rechts 3 Stelle?
Anna
Hallo Anna,
Vielleicht erklärst Du mal dein Problem und nicht die Probleme, die Du beim Versuch hast, es selbst zu lösen.
02!122
Das ist keine Zahl, das ist eine Zeichenkette.
Eine Zeichenkette kannst Du mit der SUBSTR Funktion zerlegen.
SUBSTR(x, 1, 3) liefert die ersten 3 Stellen
SUBSTR(x, -3, 3) liefert die letzten 3 Stellen
Wenn Du von einer Zahl - nicht von einem String, der Ziffern enthält - die letzten 3 Stellen haben willst, kannst Du eine Modulo-Rechnung durchführen (Rest einer Division). Dafür gibt es den % Operator. Wenn Du die letzten 3 Stellen entfernen willst, kannst Du eine Integer-Division durchführen, dafür gibt's den DIV Operator.
12345 % 1000 liefert den Rest der Division durch 1000, also 345.
12345 DIV 1000 liefert das Ergebnis der Division durch 1000, also 12.
12345678 % 1000 liefert den Rest der Division durch 1000, also 678.
12345678 DIV 1000 liefert das Ergebnis der Division durch 1000, also 12345.
Rolf
Hallo nochmal,
Wenn ich also die VAR in integer umwandele, werden mir die NULLer am Anfang fehlen.
die sind ja auch aussagefrei, wenn deine Werte wirklich Zahlen sind.
Aber wie kann ich eine Integer Zahle ich bestimmte Teile zerlegen, wie es mit einem String dann geht?
Kommt drauf an, was du wirklich vorhast. Vielleicht brauchst du das gar nicht.
Wenn ich als meine Zahl nehme:
02!122
und sie bei ! trenne, wie bekomme ich das hin
Wenn es eine Zahl sein soll, was soll dann das Ausrufezeichen?
erst wird ja nach der Umwandlung die NUll weg kommen.
2122
Dann müsste ich 2!122 trennen, kann ich sagen abschneiden rechts 3 Stelle?
Suchst du vielleicht einfach nur etwas wie number_format()?
Und wenn ja, dann bitte erst bei der Ausgabe, nicht schon in der Verarbeitungskette.
Einen schönen Tag noch
Martin
Hallo Anna,
WHERE spalte>=1021 .... da die Spalte aber keine integer ist geht es nicht.
Was genau geht nicht? Hast Du das ausprobiert? In MYSQL sollte das nämlich gehen. Denn MYSQL teilt die Vorliebe von PHP zu wilden, ungefragten Typkonvertierungen.
Wenn die führenden Nullen Teil deiner Werte sind (Postleit"zahlen" zum Beispiel), ist ein String auch der richtige Typ.
Aber für die Abfrage gibt's zwei Alternativen, die einem Standard-SQL näher kommen:
(1) Typgerecht vergleichen
SELECT spalte FROM table WHERE spalte >= '01021'
(2) Spalte für den WHERE in Zahl konvertieren
SELECT spalte FROM table WHERE CAST(spalte as UNSIGNED) >= 1021
"Unsigned"?! Ja, in der Tat. "INTEGER" versteht er nicht. Braucht er auch nicht. Weil er das eigentlich automatisch und ohne CAST tut.
Der CAST hat einen Nachteil: Wenn es einen Index gibt, der diesen WHERE optimieren könnte, dann verhindert CAST seine Verwendung. Der Vergleich mit der Zeichenkette nutzt ihn dagegen.
Rolf