Seite 1 von 1

Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 09:09
von snowflake
Guten Morgen,

ich habe ein riesen Problem mit der Sortierreihenfolge bei der Verwendung von SQLite. In der Datenbank befinden sich u. a. Namen wie folgt:

Beispiele:
Krämer
Krames


Wenn ich eine Datenbankabfrage wie folgt durchführe, wird der Name Krämer hinter dem Namen Krames einsortiert. Üblich ist aber die umgekehrte Reihenfolge (Umlaute kommen zuerst).

Code: Alles auswählen

SELECT Name From Benutzer ORDER BY Name
(ASC bzw DESC evtl. noch)

Soweit ich das im Internet nachvollziehen konnte, liegt das wohl am ASCII-Code. Ich bekomme das Problem aber irgendwie nicht zu greifen, trotz zahlreicher hinweise im Internet. Liegt die Lösung in der SQL-Abfrage oder muss ich das Problem mit Python lösen?

Vielen Dank

snowflake

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 09:20
von __deets__
„Üblich“ ist relativ. Ich hätte ä nach a sortiert. Die Schweden packen ihre Umlaute sogar hinter z. Das ist also alles ziemlich kompliziert, wie man auch hier sieht: https://de.wikipedia.org/wiki/Alphabetische_Sortierung

Was du tun musst ist SQLite eine collation Funktion zu geben, die deine gewünschte Sortierung herstellt: https://stackoverflow.com/questions/376 ... th-umlauts

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 09:53
von Sirius3
Die Sortierreihenfolge ist keine einfache Sache, denn sie unterscheidet sich von Land zu Land, z.B. zwischen Deutschland und Österreich: Alphabetische Sortierung

Das Problem nennt sich COLLATION und wird von SQLite nicht direkt unterstützt, sondern braucht eine Extension: https://www.sqlite.org/src/dir?ci=a62e6 ... cu]ext/icu.
Auch mit Python braucht es extra Pakete, z.B. PyICU.

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 10:43
von snowflake
Ich habe versucht Eure Lösungsvorschläge nachzuvollziehen. Ich stehe wie eine Ochse vor dem Berg und weiß nicht weiter.

Das hier hat bei mir nicht funktioniert:

Code: Alles auswählen

def stricmp(str1, str2):
    str1 = str1.lower()
    str2 = str2.lower()
    if str1 == str2:
        return 0
    elif str1 < str2:
        return -1
    else:
        return 1

connection  = sqlite3.connect("test.db")
connection.create_collation('NOCASE', stricmp)
Die Funktion wird gar nicht aufgerufen.

@Sirius3: Was ist das für eine Extention? Wie kann ich die einbinden?

Vielen Dank

snowflake

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 10:57
von Sirius3
Das steht doch in dem README, das ich verlinkt habe, achso, der Link ist kaputt gegangen: https://www.sqlite.org/src/dir?name=ext/icu
Und ohne eine Zusatzbibliothek funktioniert die Sortierung nicht, also wie in der Zweiten Antwort auf Stackoverlow, pyuca (Bei den Antworten auf der Seite muß man immer sehr vorsichtig sein, dass sie auch wirklich das Problem lösen, das man selbst hat).

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 11:08
von __deets__
Also fuer mich funktioniert das, und das ohne zusaetzliche Module:

Code: Alles auswählen

import sqlite3

def collate_crazy(left, right):
    if left == "deets":
        return -1
    if right == "deets":
        return 1

    return cmp(left, right)

con = sqlite3.connect(":memory:")
con.create_collation("crazy", collate_crazy)
cur = con.cursor()
cur.execute("create table test ( foo varchar )")
cur.execute("insert into test values ('deets')")
cur.execute("insert into test values ('adam')")
cur.execute("select foo from test order by foo collate crazy")
for row in cur:
    print(row)

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 11:53
von Sirius3
@__deets__: zusaetzliche Module braucht man ja auch nur, wenn man wirklich lexikalisch richtig sortieren will.

Re: Sortierreihenfolge SQLite

Verfasst: Mittwoch 14. November 2018, 11:56
von __deets__
So wie das klang hat snowflake seine eigene Version von richtig ;) So wie deets natuerlich immer nach vorne sortiert gehoert!

Re: Sortierreihenfolge SQLite

Verfasst: Donnerstag 22. November 2018, 19:56
von bb1898
__deets__ hat geschrieben: Mittwoch 14. November 2018, 11:56 So wie das klang hat snowflake seine eigene Version von richtig ;) So wie deets natuerlich immer nach vorne sortiert gehoert!
Glaube ich nicht. Sein Beispiel ist bloß unvollständig. Richtig ist doch

Krabbe
Krämer
Krames

Einverstanden, snowflake?