Abfrage nach Anfangsbuchstaben
-
tagchen!
habe ein kleines problem.
Bastel gerade an einer Webseite mit DB Anbindung.
Datenbank ist eine mysql (phpadmin). In dieser DB stehen Kundendaten.
Nun möchte ich eine Abfrage stellen, die mir ale Kundennamen ausgeben, die beispielsweise mit "S" beginnen! wie kann ich das machen, bzw. ist das überhaupt möglich?
Ich hoffe ihr könnt mir helfen und beDANKE mich schonmal!
cu Bart
-
...WHERE 'S'<=name AND name<'T'...
-
where substring(name,1,1) ='S'
-
öh, ganz dumme Frage: Warum schlägt niemand den LIKE-Operator vor? Gibt es den da nicht?
WHERE (name LIKE 'S%')
Grüße
Joe_M.
-
zufaulzumeinloggen schrieb:
öh, ganz dumme Frage: Warum schlägt niemand den LIKE-Operator vor? Gibt es den da nicht?
WHERE (name LIKE 'S%')
weil ich von gefädelten bayer-bäumen als imlementierungsdatenstruktur ausgehe und es sich da schon lohnt, die topologische absonderlichheiten lexikographischen sortierung dahingehend auszunutzen, daß zwei feste strings leicht gefunden werden können und der rest ist nur noch ein triviales (und sauschnelles) entlanghangeln.
kannst natürlich auch den tangens hyperbolikus vom anfangsbuchsteben berechnen und danach filtern.
-
volkard schrieb:
weil ich von gefädelten bayer-bäumen als imlementierungsdatenstruktur ausgehe und es sich da schon lohnt, die topologische absonderlichheiten lexikographischen sortierung dahingehend auszunutzen, daß zwei feste strings leicht gefunden werden können und der rest ist nur noch ein triviales (und sauschnelles) entlanghangeln.
kannst natürlich auch den tangens hyperbolikus vom anfangsbuchsteben berechnen und danach filtern.
Könntest Du mal bitte erklären wovon Du da sprichst.
-
Er spricht von dem internen Aufbau der binären Suchbäume. So tief stecke ich aber nicht in der Materie.
Der zweite Satz soll mich wohl nur davon abhalten hier in Zukunft meine offensichtlich unqualifizierte Meinung kundzugeben. Was ich dann wohl auch nicht mehr machen werde.
-
Könntest Du mal bitte erklären wovon Du da sprichst.
kann das nicht jemand anderes machen?
ich beantrage hiermit bei der forums-leitung einen assistenten, der bei bedarf meine antworten übersetzt.weil ich von gefädelten bayer-bäumen als imlementierungsdatenstruktur ausgehe
bayer-bäume sind mehrweg-baume, die optimiert sind für blockweise speicherzugriffe auf sehr langsamen speicher. also festplatten. es sind mehrweg-baume, wo ein knoten nicht wie normal nur zwei kinder hat, sondern so viele, daß der knoten einen block (gestern 512 bytes(plattensektor), heute 4k (übertragungseinheit beim paging mit normalem 32-bit-prozessor), morgen 8k(übliche einheit bei ia64)) belegt. außerdem wachsen sie lustigerweise an der wurzel. die meisten kennen sie nur als b-bäume. ich habe es noch nicht codiert, aber ich kann mir gut vorstellen, daß man jedem knoten zwei zusätzliche zeiger verpassen kann, die immer auf den vorgänger bzw nachfolger zeigen, wenn man in-order-traversieren würde. bei anderen sorten von bäumen macht man das hin und wieder ganz gerne. das würde dafür sorgen, daß man, sobald man mal einen wert gefunden hat, die darauffolgenden werte in korrekter reihenfolge mit sehr geringem aufwand bekommt. dieses anbringen der zusatzzeiger nennt man auch auffädeln (oder nur fädeln) von bäumen. wenn man mal einen baum auf einem blatt papier auffädelt, sieht man, warum das wort sehr gut paßt.
und es sich da schon lohnt, die topologische absonderlichheiten lexikographischen sortierung dahingehend auszunutzen,
die lexikograpische sorierung ist eine faszinierende struktur. klar ist, daß zwischen "a" und "b" unendlich viele strings dazwischenliegen können. beim ersten hischauen, würde man meinen, zwischen zwei strings läge stets mindestens ein dritter dazwischen. also wie bei den reelen (oder rationalen) zahlen. ist aber nicht. zwischen "a" und "aa" liegt kein weiterer sring dazwischen (annahme, a ist das kleinste zeichen im alphabet). faszinerend.
und faszineren dinde ich auch, daß man mit "WHERE 'S'<=name AND name<'T'" alle strings mit dem anfangsbuchstaben 'S' findet.daß zwei feste strings leicht gefunden werden können und der rest ist nur noch ein triviales (und sauschnelles) entlanghangeln.
datenbanken haben sicherlich einen optimierer, der bereichsabfragen dieser art elegant lösen kann. egal, ob der baum nun gefädelt ist oder man ne rekusive funktion nimmt. es müssen nicht alle strings angeguckt werden, sondern nur der anfang und das ende des bereich gefunden werden (mit aufwand O(log(n)) und der rest ist sauschnell.
ich kann mir nicht vrstellen, daß like das erlaubt. da vermute ich, daß er alle strings anguckt, ob sie matchen. ok, ein sehr kluger optimierer könnte like-ausdrücke, die nur die anfangsbuchstaben betreffen in bereichsabfragen umsetzen. aber ich als datenbankoptimiererprogrammierer würde diese optimierung nur mit sehr geringer prioritöt angehen, weil ich vom benutzer erwarten würde, daß er unter like-abfragen etwas teures versteht und unter bereichsabfragen etwas billiges.kannst natürlich auch den tangens hyperbolikus vom anfangsbuchsteben berechnen und danach filtern.
das wäre dann sicherlich ungewöhlich genug, daß der optimerer versagt. es war nicht auf den like-ausdruck gemünzt, sondern auf die lösung mit substring.
Der zweite Satz soll mich wohl nur davon abhalten hier in Zukunft meine offensichtlich unqualifizierte Meinung kundzugeben. Was ich dann wohl auch nicht mehr machen werde.
nein. dieser thread ist so doch sicherlich interessanter geworden, als wenn nur eine frage und eine lösung dastehen würde. das abwägen, welche der unzählichen lösungen eher gut oder eher nicht ganz so gut sind, das begründen, warum man das meint, ist doch viel wichtiger, als nur eine kleine antwort. ich bitte dich, deine meinung immer wieder kundzutun und entschuldige mich in aller form, daß es so geklungen hat, als wöllte ich dich ärgern.
-
tagchen!
thx für eure hilfe hat sehr geholfen!!!
habe aber schon wieder ne neue Frage.
Wenn ich über eine webseite was in die datenbank schreiben will, beispielsweise die Postleitzahl, dann schreibt der die zwar rein aber ohne die Null vorher (komme aus Sachsen)
Also der String ist: 01169
und in die DB schreibt er 1169
Wie kann ich das umgehen oder kann ich erzwingen das er die null mit nimmt?THX und danke schonmal!
cu Bart
-
Datenbankfeld als varchar deklarieren.