Frage bei SQL-Abfrage
Meccarianer
- asp.net
Hi!
Ich habe eine Datenbank, dessen Inhalt ich auf einer Webseite ausgeben möchte.
Das Kniffelige ist: ich will die Ausgabe aufteilen nach A - F, G - L, M - R, S - Z.
Bisher habe ich das so gelöst: Ich nehme beim Speichern eines Eintrages den ersten Buchstaben des Namens. Ich überprüfe, ob sich der Buchstabe zwischen A - F oder G - L usw. liegt. Liegt der Buchstabe zwischen A - F dann bekommt der Eintrag die Sortierung "A". Liegt der Buchstabe beispielsweise bei G - L, bekommt der Eintrag die Sortierung "G" und immer so weiter. Wenn ich die Daten anschließend ausgebe, lasse ich nach dem Feld "Sortierung" sortieren.
Ich frage mich, ob es nicht eine einfachere Methode gibt, vielleicht direkt in der SQL-Abfrage.
Viele Grüße
Der Meccarianer
Hallo Meccarianer!
Ich kanns zwar grade nur aus dem Bauch heraus sagen, aber eigentlich müsste für Strings sowas auch funktionieren:
... where feld >= 'A' and feld < 'G' order by feld;
mfg
norbert =:-)
Halihallo Meccarianer
Bisher habe ich das so gelöst: Ich nehme beim Speichern eines Eintrages den ersten Buchstaben des Namens. Ich überprüfe, ob sich der Buchstabe zwischen A - F oder G - L usw. liegt. Liegt der Buchstabe zwischen A - F dann bekommt der Eintrag die Sortierung "A". Liegt der Buchstabe beispielsweise bei G - L, bekommt der Eintrag die Sortierung "G" und immer so weiter. Wenn ich die Daten anschließend ausgebe, lasse ich nach dem Feld "Sortierung" sortieren.
Halte ich für OK.
Ich frage mich, ob es nicht eine einfachere Methode gibt, vielleicht direkt in der SQL-Abfrage.
einfacher? - depends...
a) den ersten Buchstaben in ASCII-Code auflösen, ASCII('A') abziehen und über MODULO
Operator in Gruppen aufteilen (geht nur, wenn die Gruppen _immer_ gleich lange sind,
also gleich viele Buchstaben zu einer Gruppe zusammengezogen werden)
b) neue Tabelle, die einen Buchstaben in eine GruppenID auflöst
c) ein neues Attribut, welches nur die zugeteilte Gruppe speichert und beim erstellen und
ändern eines Datensatzes immer aktualisiert wird.
d) Stored Prozedures um die Gruppe aufzulösen.
e) ???
für akzeptabel würde ich nur noch c) erklären... Eine SQL-Interne Funktion gibt es für
dies nicht.
Viele Grüsse
Philipp
Halihallo Philipp
a) den ersten Buchstaben in ASCII-Code auflösen, ASCII('A') abziehen und über MODULO
Operator in Gruppen aufteilen (geht nur, wenn die Gruppen _immer_ gleich lange sind,
also gleich viele Buchstaben zu einer Gruppe zusammengezogen werden)
uha, ich meinte die Differenz durch die Anzahl Gruppenmitglieder dividieren und den
ganzzähligen Teil daraus verwenden, dieser entspricht dann der GruppenID...
Aber lass mal lieber, diese Lösung ist nicht wirklich skalierbar ;)
'A' => 96
'B' => 97
'C' => 98
...
'H' => 103
ASCII('H')-ASCII('A') = 7
INT(7/ANZAHL_GRUPPEN_MITGLIEDER) = 1, somit ist H in der zweiten Gruppe, B wäre in der
ersten...
@Norbert: Dann kriegt er doch nur die eine Gruppe, denn diese selektierst du, andere
werden ignoriert???
Viele Grüsse
Philipp
Hallo Philipp!
Warum einfach, wenns umständlich auch geht ;-)
Natürlich kann man nahezu jede Abfrage in einen Select packen - ist halt meist eine Frage des Aufwandes.
Ich würde einfach drei Selects absetzen. Wahrscheinlich einfacher handzuhaben, als mühsames Zusammenkratzen einer geeigneten Sortierlogik. Für die Performance sind die Stringfunktionen wahrscheinlich genau so gut oder schlecht, wie drei getrennte Selects - dazu kenn ich mich aber zuwenig mit den Internas aus.
Also schaun wir mal, wezu Meccarianer tendiert ...
mfg
norbert =:-)
Halihallo norbert =:-)
Warum einfach, wenns umständlich auch geht ;-)
einfach ist laaangweilig...
Natürlich kann man nahezu jede Abfrage in einen Select packen - ist halt meist eine Frage des Aufwandes.
Ach, 'türlich, daran hatte ich eben nicht gedacht, ziehe meine Kritik zurück :-)
Ich würde einfach drei Selects absetzen. Wahrscheinlich einfacher handzuhaben, als mühsames Zusammenkratzen einer geeigneten Sortierlogik. Für die Performance sind die Stringfunktionen wahrscheinlich genau so gut oder schlecht, wie drei getrennte Selects - dazu kenn ich mich aber zuwenig mit den Internas aus.
Äm... Also in den _meisten_ Fällen[1] sind zwei Abfragen langsamer, als eine einzige...
Zumal der Request und Response über Sockets (besonders, wenn der DB-Server != ASP-
Server ist) laufen und die Stringfunktionen vergleichsweise tausendmal schneller sind.
Zudem kommt SQL-Anfrage-Optimizer, SQL-Parser, blablabla... Also in den meisten fällen
ist die Lösung über einen Query wohl schon besser aus Sicht der Performance, aber von
allem anderen (Wartbarkeit, Komplexität, ...) möchte ich nicht reden, da wirst du die
Nase vorn haben ;)
[1] Ausnahmen gibt es sehr wohl! - Bei gewissen Datenbeständen könnte ich mir gut vor-
stellen, dass sogar dieses Problem eine Ausnahme werden kann.
Viele Grüsse
Philipp
Das Kniffelige ist: ich will die Ausgabe aufteilen nach A - F, G - L, M - R, S - Z.
Ich frage mich, ob es nicht eine einfachere Methode gibt, vielleicht direkt in der SQL-Abfrage.
Oi,
aus zahllosen möglichen Lösungen könntest Du zum Beispiel in der Abfrage das erste Zeichen auf die Existenz in einer Liste erlaubter Zeichen testen:
SELECT blah
FROM blah
WHERE FIELD(UPPER(LEFT(nachname,1)),"A","B","C","D","F") > 0
HTH Robert