ss80: SQL Syntax 4 stellig

Hallo zusammen

Zu meinem Problem ich erhalte per POST-Request eine Zahl zwischen 1 und 9. Danach möchte ich anschliessend mit dieser Zahl in einer Spalte suchen.

Die Einträge in der Spalte sind zum Teil 1 bis 4 stellig.

Wie kann ich im SQL Syntax angeben das er nur nach 4 stelligen Einträgen suchen soll?

Logischerweise wenn ich jetzt SpalteX LIKE '1%' findet er mir folgende:

1 11 111 1111

Jedoch möchte ich davon nur 1111 erhalten (alle 4 stelligen).

Danke und Gruss ss80

  1. Hallo,

    Wie kann ich im SQL Syntax angeben das er nur nach 4 stelligen Einträgen suchen soll?

    vierstellig heißt, größer oder gleich 1000 und kleiner als 10000.
    Warum einfach, wenn's auch umständlich geht? ;-)

    Ciao,
     Martin

    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      Wie kann ich im SQL Syntax angeben das er nur nach 4 stelligen Einträgen suchen soll?

      vierstellig heißt, größer oder gleich 1000 und kleiner als 10000.
      Warum einfach, wenn's auch umständlich geht? ;-)

      Das hängt aber davon ab, welchen Typ wie die Spalte hat. Man kann schließlich '1234' auch in einer Spalte eines Stringtyps speichern.

      Spirituelle Grüße
      Euer Robert

      --
      Möge der wahre Forumsgeist ewig leben!
      1. Hallo,

        vierstellig heißt, größer oder gleich 1000 und kleiner als 10000.
        Warum einfach, wenn's auch umständlich geht? ;-)

        Das hängt aber davon ab, welchen Typ wie die Spalte hat. Man kann schließlich '1234' auch in einer Spalte eines Stringtyps speichern.

        das stimmt natürlich, aber ein sinnvolles Datenmodell hatte ich stillschweigend vorausgesetzt. Immerhin war im Startposting immer von Zahlen die Rede.

        Ciao,
         Martin

        1. Lieber Martin, liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          vierstellig heißt, größer oder gleich 1000 und kleiner als 10000.
          Warum einfach, wenn's auch umständlich geht? ;-)

          Das hängt aber davon ab, welchen Typ wie die Spalte hat. Man kann schließlich '1234' auch in einer Spalte eines Stringtyps speichern.

          das stimmt natürlich, aber ein sinnvolles Datenmodell hatte ich stillschweigend vorausgesetzt. Immerhin war im Startposting immer von Zahlen die Rede.

          Ich habe das allerdings auch nicht fertig vorgekaut. Denn die Randbedingung lautete, dass die Ziffer '1' nur einmal in einer (vierstelligen) Ziffernfolge vorkommen sollte. Das läuft vermutlich doch auf einen Stringvergleich hinaus oder auf einen RegExp, was ja eigentlich auch ein komplexer Stringvergleich ist.

          Spirituelle Grüße
          Euer Robert

          --
          Möge der wahre Forumsgeist ewig leben!
          1. Lieber Martin, liebe Mitdenker, liebe Wissende, liebe Neugierige,

            ja!

            Ich habe das allerdings auch nicht fertig vorgekaut. Denn die Randbedingung lautete, dass die Ziffer '1' nur einmal in einer (vierstelligen) Ziffernfolge vorkommen sollte.

            Und das stellt sich bei nochmaligem Lesen auch noch als falsch heraus höhöhö

            Anregungen sollte der OP inzwischen aber genügend haben ;-)

            Spirituelle Grüße
            Euer Robert

            --
            Möge der wahre Forumsgeist ewig leben!
  2. Tach!

    Wie kann ich im SQL Syntax angeben das er nur nach 4 stelligen Einträgen suchen soll?

    Logischerweise wenn ich jetzt SpalteX LIKE '1%' findet er mir folgende:

    Es gibt zwei Jokerzeichen für LIKE, % steht für mehrere Zeichen, _ (Unterstrich) für ein einzelnes.

    dedlfix.

    1. Lieber Dedlfix, liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      Wie kann ich im SQL Syntax angeben das er nur nach 4 stelligen Einträgen suchen soll?

      Logischerweise wenn ich jetzt SpalteX LIKE '1%' findet er mir folgende:

      Es gibt zwei Jokerzeichen für LIKE, % steht für mehrere Zeichen, _ (Unterstrich) für ein einzelnes.

      Zielführender wird hier aber

      WHERE LENGTH(`spalte`) = 4 AND `spalte`LIKE '%1%'
      

      sein, und zwar genau in dieser Reihenfolge. Erst die billige Bedingung und dann die teure. Length()

      Obiges führt allerdings auch noch zu "ätsch', weil die '1' hier auch noch mehrmals vorkommen darf im Spaltenwert.

      Da Könnte man nun abfragen, wie oft der Substring '1' im Spaltenwert vorkommt, indem man die Länge des Spaltenwertes abfragt, dann alle Vorkommen von '1' im Spaltenwert ersetzt durch '' und dann die Länge erneut feststellt. Länge_1 - Länge_2 muss dann der geforderten Anzahl von Vorkommen sein. Prima, lässt sich alles in einer geschachtelten Funktion schreiben, ist aber auch nicht mehr ganz billig.

      Außerdem gäbe es auch noch, wenn man es ganz universell und teuer machen will, Regexp()

      Die Beispiele aus MySQL, weil kein DBMS angegeben war.

      Spirituelle Grüße
      Euer Robert

      --
      Möge der wahre Forumsgeist ewig leben!
      1. Tach!

        Wie kann ich im SQL Syntax angeben das er nur nach 4 stelligen Einträgen suchen soll? Logischerweise wenn ich jetzt SpalteX LIKE '1%' findet er mir folgende:

        Es gibt zwei Jokerzeichen für LIKE, % steht für mehrere Zeichen, _ (Unterstrich) für ein einzelnes.

        Zielführender wird hier aber

        WHERE LENGTH(`spalte`) = 4 AND `spalte`LIKE '%1%'
        

        sein,

        Das ist nun aber etwas hineininterpretiert, was so nicht ganz klar in der Frage stand. Der gezeigte Code geht davon aus, dass die gesuchte Ziffer am Anfang vorkommt. Die Frage ist, ob das so richtig ist oder ob die Ziffer doch an beliebiger Stelle stehen soll.

        und zwar genau in dieser Reihenfolge. Erst die billige Bedingung und dann die teure.

        Wenn sie nur am Anfang vorkommen soll, ist LIKE '1____' ohne Längenprüfung anzunehmenderweise performant genug, wenn ein Index auf der Spalte sitzt.

        Obiges führt allerdings auch noch zu "ätsch', weil die '1' hier auch noch mehrmals vorkommen darf im Spaltenwert.

        Das Beispiel 1111 zeigt, dass Mehrfachvorkommen wohl unproblematisch sind. Nicht ganz klar zu entnehmen ist, ob nur 1111 gefunden werden soll oder auch zum Beispiel 1234.

        dedlfix.

      2. Huhu

        WHERE LENGTH(spalte) = 4 AND spalteLIKE '%1%'

        
        sein, und zwar genau in dieser Reihenfolge.
        

        Die Reihenfolge von Bedingungen innerhalb von where ist völlig irrelevant. Der Optimizer der Datenbank schiebt sich das so zurecht, wie das am effizientesten ausgeführt werden kann.

        Btw, wenn spalte nummerisch sein sollte, bedeutet ein Vergleich mit Like immer eine Typkonvertierung, damit wäre dann kein normaler Index mehr nutzbar. Für Zahlen wäre also eine Suche wie

        spalte between 1000 and 1999 
        

        erheblich effizienter.

        Gruss Daniela

        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          Huhu

          WHERE LENGTH(spalte) = 4 AND spalteLIKE '%1%'

          
          sein, und zwar genau in dieser Reihenfolge.
          

          Die Reihenfolge von Bedingungen innerhalb von where ist völlig irrelevant. Der Optimizer der Datenbank schiebt sich das so zurecht, wie das am effizientesten ausgeführt werden kann.

          Wenn das DBMS denn einen Optimizer hat... MMn ist es nicht verkehrt, das in einer plausibel "richtigen" Reihenfolge zu notieren. WEnn das DBMS dann einen Optimizer hat, ist es ja kein Schaden!

          Btw, wenn spalte nummerisch sein sollte, bedeutet ein Vergleich mit Like immer eine Typkonvertierung, damit wäre dann kein normaler Index mehr nutzbar. Für Zahlen wäre also eine Suche wie

          spalte between 1000 and 1999 
          

          Das hatten wir schon diskutiert. MMn hat hier der deklarierte Spaltentyp Priorität und nicht der übergebene Suchstring. Der muss dann ggf. allerdings umgewandelt werden.

          Wenn die Spalte als Stringtyp deklatiert wurde, wird sie sich eventuell wohl kein "between" gefallen lassen.

          Spirituelle Grüße
          Euer Robert

          --
          Möge der wahre Forumsgeist ewig leben!
    2. Hallo,

      spannend wirds, wenn nach Eingabe der 0 Zahlen gefunden werden sollen, die weniger als 4 Stellen haben...

      Gruß Kalk