SQL-Abfrage: Dritte Zahl gesucht
Sven
- datenbank
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
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
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
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
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
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
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
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
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
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
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