Sven: SQL-Abfrage: Dritte Zahl gesucht

Hallo,

ich bin ziemlicher SQL-Laie und möchte eine SQL-Abfrage formulieren, die mir alle Werte aus einer Spalte ausliest, in denen die dritte Zahl eine 1 ist. Also zum Beispiel soll sie 95123456 ausgeben, aber 94254130 soll sie nicht ausgeben.

Kann mir da jemand von Euch weiterhelfen?

Gruß,
Sven

  1. N'Obend

    ich bin ziemlicher SQL-Laie und möchte eine SQL-Abfrage formulieren, die mir alle Werte aus einer Spalte ausliest, in denen die dritte Zahl eine 1 ist. Also zum Beispiel soll sie 95123456 ausgeben, aber 94254130 soll sie nicht ausgeben.

    Kurze Suche mit google ergab folgende Möglichkeit:

    SELECT *
    FROM   tabelle
    WHERE  spalte LIKE '__1%';

    Wobei *, tabelle und spalte jeweils durch geeignetes ersetzt werden.
    Der Unterstrich sollte Platzhalter für jeweils ein Zeichen sein, % für beliebig viele.
    Hab das allerdings nicht getestet und bin ebenso SQL-Laie. Aber vielleicht hilfts ja.

    Tschö,
    dbenzhuser

    --
    Heute in der Reihe „unser Ranking soll schöner werden“:
    Gefälschte Musikinstrumente Marke Bessons
  2. Hallo Sven,

    ich bin ziemlicher SQL-Laie und möchte eine SQL-Abfrage formulieren, die mir alle Werte aus einer Spalte ausliest, in denen die dritte Zahl eine 1 ist. Also zum Beispiel soll sie 95123456 ausgeben, aber 94254130 soll sie nicht ausgeben.

    Die Funktion SUBSTRING sollte da helfen: SELECT ... WHERE SUBSTRING(spaltenname,3,1) = '1'

    Grüße aus Nürnberg
    Tobias

    1. N'Obend

      Die Funktion SUBSTRING sollte da helfen: SELECT ... WHERE SUBSTRING(spaltenname,3,1) = '1'

      Gehe ich recht in der Annahme, dass SUBSTRING schneller ist als mein LIKE-Versuch?

      Und ist das normal, dass die MySQL-Seite unlesbar kleine Schrift enthält (Firefox)? Im IE siehts allerdings besser aus... grmpf

      Tschö,
      dbenzhuser

      --
      Heute in der Reihe „unser Ranking soll schöner werden“:
      Gefälschte Musikinstrumente Marke Bessons
      1. Hallo dbenzhuser

        N'Obend

        Die Funktion SUBSTRING sollte da helfen: SELECT ... WHERE SUBSTRING(spaltenname,3,1) = '1'

        Gehe ich recht in der Annahme, dass SUBSTRING schneller ist als mein LIKE-Versuch?

        Deine Version hat den Vorteil, dass sie unter MS SQL-Server das gewünschte Ergebnis liefert, die Lösung von Tobias erfordert nach meinem Versuch noch einen expliziten Cast, obwohl laut Tabelle eine implizite Typmwandlung vorgenommen werden sollte.

        SELECT ... where SUBSTRING( CAST(spaltenname AS varchar), 3, 1) = '1'

        Was schneller ist? Testen!

        Und ist das normal, dass die MySQL-Seite unlesbar kleine Schrift enthält (Firefox)? Im IE siehts allerdings besser aus... grmpf

        Zu Firefox: ja die Schrift ist sehr klein.
        Zu IE: keine Aussage möglich, die hab' ich mir noch nie im IE angeschaut :-)

        Freundliche Grüße

        Vinzenz

        1. N'Obend

          WHERE SUBSTRING(number,3,1) = "1"
          vs.
          WHERE number LIKE "__1%"

          Was schneller ist? Testen!

          Da das Wetter heute wieder etwas bescheidener ist (gestern gings an den Badesee) hab ich das jetzt mal gemacht:

          Versuchsziel:
          Ausgabe der Zahlen mit einer "1" an dritter Stelle.

          Versuchsaufbau:
          Mein Notebook mit Centrino 1,6GHz mit halbwegs aktuellem XAMPP.
          Tabelle mit 100000 Einträgen zu je einer 10-stelligen Zufallszahl. Davon 9785 mit einer "1" an der dritten Stelle (da sind sich die Abfragen einig).
          Die Abfragen werden jeweils in einer Schleife 100 mal ausgeführt und dann die durchschnittliche Laufzeit ausgegeben. Das ganze dann ein paar mal mit F5 ausprobiert um Schwankungen auszuschließen.

          Ergebnisse:
          LIKE:      ca. 0,097 Sekunden pro Abfrage
          SUBSTRING: ca. 0,104 Sekunden pro Abfrage

          Hatte mich also geirrt, LIKE ist schneller. Nicht viel, aber immerhin messbar. Falls meine Messreihe überhaupt aussagekräftig ist...

          Bleibt noch die Frage was uns die Antwort bringt :)

          Tschö,
          dbenzhuser

          --
          Heute in der Reihe „unser Ranking soll schöner werden“:
          Gefälschte Musikinstrumente Marke Bessons
          1. Hallo dbenzhuser

            Hatte mich also geirrt, LIKE ist schneller. Nicht viel, aber immerhin messbar. Falls meine Messreihe überhaupt aussagekräftig ist...

            Bleibt noch die Frage was uns die Antwort bringt :)

            Nimm LIKE! Portabler und dazu noch schneller :-)

            Freundliche Grüße

            Vinzenz

          2. Hallo dbenzhuser,

            Mein Notebook mit Centrino 1,6GHz mit halbwegs aktuellem XAMPP.

            Centrino 1,86GHz mit Apache 2.0.53/PHP5.0.4/MySql4.0.24

            Tabelle mit 100000 Einträgen zu je einer 10-stelligen Zufallszahl.

            500.000 Einträge mit 5-stelliger Zufallszahl - für mehr Einträge hatte ich keine Lust, das hat mir zu lange gedauert. Aber hier gleich noch eine Frage am Rande: wie füllt man eine Datenbank möglichst schnell mit sehr vielen Werten (>=1Mio)?

            Davon 9785 mit einer "1" an der dritten Stelle (da sind sich die Abfragen einig).

            50027 - mt_rand verzeilt die Zahlen eben recht gut, so dass genau 1/10 aller Zahlen eine 1 an dritter Stelle hat :-)

            Die Abfragen werden jeweils in einer Schleife 100 mal ausgeführt und dann die durchschnittliche Laufzeit ausgegeben. Das ganze dann ein paar mal mit F5 ausprobiert um Schwankungen auszuschließen.

            Ich habe die Querys einfach in phpMyadmin eingegeben und komme pro Abfrage auf jeweils 0,001 bis 0,002 Sekunden (jeweils mit Ausreißern nach oben und nach unten) - wobei SUBSTRING tendentiell geringfügig höher liegt. Achja - auch ein Index hat keine Auswirkungen (vermutlich deshalb weil beide Varianten den nicht nutzen können?)

            Grüße aus Nürnberg
            Tobias

      2. Hi,

        Und ist das normal, dass die MySQL-Seite unlesbar kleine Schrift enthält (Firefox)?

        Wenn Du den Fehler gemacht hast, in Deinem Firefox keine Mindestschriftgröße anzugeben: ja

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo MudGuard

          Und ist das normal, dass die MySQL-Seite unlesbar kleine Schrift enthält (Firefox)?

          Wenn Du den Fehler gemacht hast, in Deinem Firefox keine Mindestschriftgröße anzugeben: ja

          Danke!

          Freundliche Grüße

          Vinzenz

        2. N'Obend

          Und ist das normal, dass die MySQL-Seite unlesbar kleine Schrift enthält (Firefox)?

          Wenn Du den Fehler gemacht hast, in Deinem Firefox keine Mindestschriftgröße anzugeben: ja

          Ahh, sieht doch gleich viel besser aus :)
          Die Option muss ich bisher übersehen haben, vielen Dank.

          Tschö,
          dbenzhuser

          --
          Heute in der Reihe „unser Ranking soll schöner werden“:
          Gefälschte Musikinstrumente Marke Bessons