![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: Delphi
Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Hallo Forengemeinde und Firebird-Spezialisten!
Wenn ich in einer Firebird-Datenbank eine Spalte, die Text (Varchar 200) enthält, sortiere, dann erscheinen in meiner Tabelle zuerst die Großbuchstaben nach ABC sortiert und danach die Kleinbuchstaben. Das heißt, die Spalte mit dem String "Die Große Versuchung" steht vor der Spalte mit dem String "Die alte Welt". Ich möchte aber bei der Sortierungt auf die Berücksichtigung von Groß-Kleinschreibung verzichten, so daß ein a vor dem B sortiert wird. Hat das überhaupt etwas mit der Datenbank zu tun? Ich sortiere mit Dataset.DoSort. Daten: Firebird 2.1 Radstudio 2009 pro arbeite vorwiegend mit Delphi FibPlus-Komponenten Win-XP Pro |
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Lege einen expression index auf Upper() an oder eine entsprechende collation (Sortierreihenfolge)
|
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Ein Expression index hilft da gar nichts. Ein Index dient prinzipiell dazu, eine Suche bzw die Sortierung zu beschleunigen, aber wenn für eine Query keine case-insensitive Collation angegeben ist, wird der expression Index zwar in der Datenbank vorhanden sein, aber für die Query einfach nicht verwendet werden.
Das Vorhandensein oder nicht Vorhandensein eines Index beeinflusst in keiner Weise die Reihenfolge, in der Datensätze von einer Query geliefert werden. entweder die Collation der entsprechenden Spalte ist von vorneherein caseinsensitiv, oder man muss bei der Query eine entsprechende collate Klausel angeben. Ist eine Spalte mit einer case insensitiven Collation definiert, dann ist auch ein Index auf die Spalte automatisch case insensitiv, ein expression index auf upper() ist dann unnötig. |
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
TQuery und 'Order by UPPER()' ??
|
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Zitat:
Es gibt glaube ich bei Firebird auch spezielle Collations, die zwar zwischen Gross- und Kleinschreibung unterscheiden, aber nur dann, wenn es keine anderen Unterschiede zwischen den Spaltenwerten gibt also z.B. AA < Aa < aa < AB < Ab < ab < AB1. |
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Einige Hinweise habe ich hier gefunden:
![]() expression index (ab 2.0) und UNICODE_CI (ab 2.1.2) sehen interessant aus |
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Zitat:
|
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Ich glaube, Du hast das Thread-Thema missverstanden: Es geht nicht um Gross/Kleinschreibung bei Spaltennamen - da stimme ich Dir übrigens 100%ig zu, diese zwischen Hochkomma gesetzten Spaltennamen erscheinen mir auch sinnlos und nur dazu geeignet, Verwirrung zu stiften - sondern darum, die Spalteninhalte unabhängig von der Gross-Kleinschreibung zu sortieren.
Zitat:
|
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Zitat:
Verwende zwar kein TQuery, sondern weiterhin TDataset und kann auch für alle anderen Spalten weiterhin DoSort verwenden. Diese eine Spalte, in der Groß- und Kleinschreibung vorkommt, unterziehe ich jetzt einer Sonderbehandlung, indem ich sie aus dem CASE-Construct ausgliedere und die Sortierung direkt dem SelectSQL-String zuweise. Vorher:
Delphi-Quellcode:
Nachher:
PROCEDURE Sort_Titel(Spalte : INTEGER);
VAR Merk : INTEGER; Aus : STRING; BEGIN Merk := DatMod.FibSet_Titel.FieldByName('INDEX').AsInteger; IF Spalte = SortIndex THEN SortOrder := NOT SortOrder ELSE SortOrder := TRUE; CASE Spalte OF 0 : DatMod.FibSet_Titel.DoSort(['INDEX'], [SortOrder]); 1 : DatMod.FibSet_Titel.DoSort(['TITEL'], [SortOrder]); 2 : BEGIN MeldungEin; DatMod.FibSet_Titel.DoSort(['VRegie'], [SortOrder]); MeldungAus; END; ... END;
Delphi-Quellcode:
Kurze Erläuterung: SortIndex ist die Spaltennummer, nach der aktuell sortiert ist und die nach jeder neuen Sortierung gesetzt wird. SortOrder hat bei ASC den Wert TRUE und bei DESC den Wert FALSE. Beide Variablen sind global. So kann ich wie bei Excel durch einen Klick auf den Spaltentitel die Sortierung vornehmen, wobei ein zweiter Klick auf denselben Spaltentitel die Sortierung umkehrt.
PROCEDURE Sort_Titel(Spalte : INTEGER);
VAR Merk : INTEGER; Aus : STRING; BEGIN Merk := DatMod.FibSet_Titel.FieldByName('INDEX').AsInteger; IF Spalte = SortIndex THEN SortOrder := NOT SortOrder ELSE SortOrder := TRUE; IF (Spalte <> 1) AND (SortIndex = 1) THEN BEGIN DatMod.FibSet_Titel.Close; DatMod.FibSet_Titel.SQLs.SelectSQL.Text := 'SELECT * FROM TITEL'; DatMod.FibSet_Titel.Open; END ELSE IF Spalte = 1 THEN BEGIN DatMod.FibSet_Titel.Close; Aus := 'SELECT * FROM TITEL ORDER BY LOWER(TITEL) '; IF SortOrder THEN Aus := Aus + 'ASC' ELSE Aus := Aus + 'DESC'; DatMod.FibSet_Titel.SQLs.SelectSQL.Text := Aus; DatMod.FibSet_Titel.Open; END; CASE Spalte OF 0 : DatMod.FibSet_Titel.DoSort(['INDEX'], [SortOrder]); {ausgeklammert: 1 : DatMod.FibSet_Titel.DoSort(['TITEL'], [SortOrder]);} 2 : BEGIN MeldungEin; DatMod.FibSet_Titel.DoSort(['VRegie'], [SortOrder]); MeldungAus; END; ... END; |
AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Warum um Himmels Willen machst Du es Dir so kompliziert? Und wenn die Spalte später noch in einem anderen Grid auftaucht oder eine andere Spalte in einer anderen Tabelle dazukommt, die Du caseinsensitiv haben willst, hast Du jedesmal von Neuem das Theater.
Mit einer geeigneten Collation bei der Spalte brauchst Du keine einzige Zeile zusätzlich zu programmieren, um die eine Spalte caseinsensitiv zu sortieren. Das ist gerade mal eine Klausel bei der Spaltendefinition! Dazu kommt, dass mit der Wahl einer geeigneten Collation auch die Umlaute sinnvoll mitsortiert werden, was bei der Standard Firebirdcollation nicht der Fall ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz