-
Forum: Datenbanken
by idefix2,
25. Jun 2010
Der Expression Index isrt NICHT das Feld. Wenn Du später irgendwo das Feld verwendest, darfst Du NIE auf das UPPER vergessen, und das sind mögliche Fehler von der Art, die extrem mühsam zu finden sind, weil sie sich u.U. irgendwo auswirken, wo man nicht damit rechnet.
-
Forum: Datenbanken
by idefix2,
25. Jun 2010
Wenn Du eine eigene Collation "erstellen" müsstest, hättest Du Recht. Aber es geht ja ganz einfach, z.B.:
create collation collate_filename
for ISO8859_1 <- verwendeter Zeichensatz
from de_de <- Basiscollation, aus der eine mit den gewünschten Eigenschaften gemacht wird
case insensitive
accent sensitive;
-
Forum: Datenbanken
by idefix2,
25. Jun 2010
Ich verstehe nicht, was an der Verwendung der für den Zweck geeigneten Collation "kanonenhaft" sein soll. Mit einer case-insensitiven Collation wird dem DBMS gesagt, dass in dieser Spalte die Gross/Kleinschreibung generell nicht berücksichtigt werden soll. Alles andere sind Workarounds, die nur mühsam sind und in der Folge immer wieder zu Fehlern führen werden, weil man leicht bei irgend einer...
-
Forum: Datenbanken
by idefix2,
25. Jun 2010
alle Duplikate löschen müsste in etwa so gehen (ohne Garantie :wink:):
delete from tabelle t1 where (select count(*) from tabelle where upper(name)= upper(t1.name))>1
-
Forum: Datenbanken
by idefix2,
25. Jun 2010
Das Problem ist, dass Du dann alle Duplicates löschen würdest (dort, es Duplicates gibt, alle vorkommen, sodass keiner übrigbleibt), was Du wahrscheinlich auch nicht willst.
Wenn Gross-Kleinschreibung bei der Duplicates-Erfassung ignoriert werden sollen, soll sie mit ziemlicher Sicherheit in der Spalte generell ignoriert werden, auch bei Abfragen, die Dir später irgendwann in Deiner Anwendung...
-
Forum: Datenbanken
by idefix2,
23. Jun 2010
Das glaube ich nicht.
Ein Index wird von Firebird ja nur dazu verwendet, Abfragen zu beschleunigen, die zu dem Index passen. Bei der Abfrage selbst gibst Du aber keinen Index an, die Abfrage ist also erst einmal Indexunabhängig defniert. Kommt in der Abfrage kein UPPER vor und Du hast einen Index mit UPPER definiert, dann wird dieser Index für die Abfrage ganz einfach nicht verwendet, weil er ja...
-
Forum: Datenbanken
by idefix2,
23. Jun 2010
Ich würde eine neue Tabelle mit geeigneter Collation erstellen und die Werte der alten Tabelle mittels "Update or insert" Statement in die neue Tabelle einfügen, dann die alte Tabelle löschen und die neue Tabelle umbenennen. Dann sind die Duplicates weg.
-
Forum: Datenbanken
by idefix2,
23. Jun 2010
Es kommt darauf an. Bei einer kleinen Anwendung mit nur einer derartigen Spalte und einer Abfrage ist das etwas einfacher - wobei ja eine case-insensitive Collation in einem einzeiler von einer case-sensitiven abgeleitet werden kann, also auch nicht sehr kompliziert ist.
Bei einer grösseren Anwendung, wenn man viele Datenbankfelder standardmässig case insentiv haben will, sollte man aber auf...
-
Forum: Datenbanken
by idefix2,
23. Jun 2010
So natürlich ist es nicht. Wenn eine Collating Sequence für die Spalte angegeben ist, der Case-insensitiv ist, behandelt Firebird nach dem, was ich bis jetzt gelesen hat, unterschiedliche Case-Werte auch im Vergleich als identisch.
Die neusten Versionen von Firebird erlauben eigene Collating Sequences zu erstellen, wenn Du willst, dass Gross und Kleinbuchstaben in dem Feld als gleich behandelt...
-
Forum: Datenbanken
by idefix2,
23. Jun 2010
Ja, Du hast recht, so wie oben geschrieben geht es nicht. aber so:
select upper(ip_name) from musik
group by upper(ip_name) having count(*)>1
Das hab ich in meiner DB probiert, ip_name -> feld, musik -> tabelle
-
Forum: Datenbanken
by idefix2,
22. Jun 2010
Was sein könnte, ist, dass Dein Tool vielleicht Daten als Duplicates ansieht, die für Firebird unterschiedlich sind, das hängt bei Firebird vom verwendeten Zeichensatz und von der verwendeten Collation ab (Gross-Kleinschreibung, Umlaute etc.)
Versuch einmal
select feld from tabelle
group by upper(feld) having (count(*)>1)
-
Forum: Datenbanken
by idefix2,
22. Jun 2010
Wenn feld das zu prüfende Feld in der Tabelle tabelle ist, z.B. so:
select feld from tabelle
group by feld having (count(*)>1)
Dann bekommst Du auch gleich serviert, welche Feldwerte mehrfach vorkommen.
-
Forum: Datenbanken
by idefix2,
22. Jun 2010
????
Wo fehlen Einträge? in der Datenbank? Vom Exportieren einer Spalte können keine Datensätze verschwinden.
Hast Du noch eine Kopie der DB, in der die Sätze da sind?
Wenn Du glaubst, dass es Duplicates gibt, kannst Du das doch direkt in der Datenbank mit einem einfachen SQL Statement feststellen, wozu ein externes Tool?