Anna: mysql, Select Abfrage varchar als Integer behandeln

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.

... 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

  1. 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

    --
    Мир для України.
    1. 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

      1. 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

        --
        sumpsi - posui - obstruxi
      2. 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

        --
        Мир для України.
  2. 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

    --
    sumpsi - posui - obstruxi