AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird-Spalte ohne Groß-Klein-Schreibung sortieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

Ein Thema von Perlsau · begonnen am 14. Jan 2011 · letzter Beitrag vom 19. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
Perlsau
(Gast)

n/a Beiträge
 
#1

Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 14. Jan 2011, 19:16
Datenbank: Firebird • Version: 2.1 • Zugriff über: Delphi
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 14. Jan 2011, 19:31
Lege einen expression index auf Upper() an oder eine entsprechende collation (Sortierreihenfolge)
Markus Kinzler

Geändert von mkinzler (14. Jan 2011 um 19:36 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 14. Jan 2011, 20:52
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.

Geändert von idefix2 (14. Jan 2011 um 20:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 14. Jan 2011, 21:31
TQuery und 'Order by UPPER()' ??
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 15. Jan 2011, 00:06
TQuery und 'Order by UPPER()' ??
Das ist sinnvoll, wenn man einmal ausnahmsweise bei einer Query die Gross/Kleinschreibung unberücksichtigt lassen will, aber sonst sehr wohl eine unterschiedliche Behandlung haben will. Wenn in einer Spalte die Sortierung prinzipiell nicht zwischen Gross- und Kleinschreibung unterscheiden soll, ist die Angabe einer geeigneten Collating Sequence direkt bei der Spaltendefinition auf jeden Fall besser.

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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 15. Jan 2011, 11:03
Einige Hinweise habe ich hier gefunden:

http://www.destructor.de/firebird/ca...tivesearch.htm

expression index (ab 2.0) und UNICODE_CI (ab 2.1.2) sehen interessant aus
Michael Justin
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 15. Jan 2011, 12:35
TQuery und 'Order by UPPER()' ??
Das ist sinnvoll, wenn man einmal ausnahmsweise bei einer Query die Gross/Kleinschreibung unberücksichtigt lassen will.
Die Regel ist, also das zu unterscheiden, oder wie ? Wer das macht, der ist echt selber schuld. Aber was soll denn das ? Man sorgt zu 99,9 % für unerwünschtes Ergebnis. Im Firebird-Umfeld ist es noch krasser : einmal GrOss/Kleinschreibung, immer Gross/Kleinschreibung. D.h. "FelD" <> "Feld" ! Da handelt man sich sogar noch "QuotedStr" ein. Es ist schon schlimm genug, wenn die Sortierreihenfolge nicht stimmt. Noch schlimmer ist aber, dass eventuell die Ergebnisse nicht stimmen, Suche nicht geht und bestenfalls die DB nur nicht neu compiliert wird. Nur weil für einen Buchstaben Caps-Lock aus Versehen eingeschaltet war oder die Finger verrutscht sind.
Gruß
Hansa
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#8

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 15. Jan 2011, 19:31
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:
Die Regel ist, also das zu unterscheiden, oder wie ?
Eine allgemeine Regel gibt es da nicht. Ob man zwei Feldinhalte, die sich nur in bezug auf die Gross/Kleinschreibung unterscheiden, als völlig gleich behandeln will (-> zufällige Reihenfolge im Result Set, wenn es keine anderen Kriterien gibt), oder ober man sie zwar in der Sortierung beisammen haben will, aber doch immer das Feld mit Grossbuchstaben vor dem mit Kleinbuchstaben im Resultset aufscheinen soll, oder ob die Daten strikt nach ASCII-Werten sortiert werden sollen (also Gross- und Kleinbuchstaben weit auseinander) hängt wohl von der Anwendung und ihren Anforderungen ab, wobei mir zugegebenermassen für die letzte Variante kaum ein sinnvolles Praxisbeispiel einfällt.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 16. Jan 2011, 18:36
TQuery und 'Order by UPPER()' ??
Vielen Dank, das hat geholfen!

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:
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;
Nachher:
Delphi-Quellcode:
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 + 'ASCELSE 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;
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.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#10

AW: Firebird-Spalte ohne Groß-Klein-Schreibung sortieren

  Alt 16. Jan 2011, 21:47
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.

Geändert von idefix2 (16. Jan 2011 um 22:30 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz