SQLite - Natürliche Sortierung?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

SQLite - Natürliche Sortierung?

Beitrag von pluto »

Hallo

In meiner Anwendung, hätte ich gerne eine Natürliche Sortierung:
select id, Title, CreateDateTime, LastWriteDateTime, LastReadDateTime, ReadCount, WriteCount, JsonCode, TagList from NoteTable order BY Title;
Liefert mir leider keine Natürliche Sortierung zurück.

Bei einer Internet Suche habe ich leider nichts hilfreiches gefunden.

Nun sehe ich im Prinzip zwei Möglichkeiten:
1. Schön wäre es, wenn SQLite eine Natürliche Sortierung anbieten würde, wenn ja, wie wende ich sie an?
Ich habe auch schon "order by Title + 0" versucht, eine quelle sagt, dass das gehen sollte:
https://westonganger.com/posts/easily-d ... t-with-sql
Aber scheinbar klappt das bei mir jedenfalsl nicht.

2. Ich lese die Daten in ein JSON Array ein, um sie an eine Web Client zu Senden.
Nun dachte ich, ich könnte probieren, die Daten "einfach" mit JSON zu Sortieren:
Es gibt ja die Methode Sort in einem TJSON Array. Aber wie verwende ich sie?
Sort erwartet eine Function: "TListSortCompare = function (Item1, Item2: Pointer): Integer;"

Code: Alles auswählen

function mySort(Item1, Item2: Pointer):Integer
begin
end;
MFG
Michael Springwald

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SQLite - Natürliche Sortierung?

Beitrag von sstvmaster »

Eventuell so:
SELECT name FROM animals ORDER BY name COLLATE NOCASE;
Hier hatte auch einer die selbe Frage, dort sollte wohl der Befehl NATSORT eingeführt werden habe nix dazu gefunden:
https://sqlite.org/forum/info/d5cf6c6317dd7e7f
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SQLite - Natürliche Sortierung?

Beitrag von pluto »

Hier hatte auch einer die selbe Frage, dort sollte wohl der Befehl NATSORT eingeführt werden habe nix dazu gefunden:
Auf Natsort bin ich auch schon gestoßen, aber muss ich dafür ein "plugin" laden? Ein Plugin Lade ich schon:
SQlConnector.LoadExtension('/usr/lib/sqlite3/pcre.so');

Ich finde, dass irgendwie auch Sinnfrei im Jahr 2021 nicht gleich eine Natürliche Sortierung zurück zu geben oder?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SQLite - Natürliche Sortierung?

Beitrag von pluto »

Das Plugin habe ich nun erstellt das war realtiv einfach und ich habe es in SQL Lite DB Browser geladen mit meiner Datenbank, aber wie wende ich es an?
select id, Title, CreateDateTime, LastWriteDateTime, LastReadDateTime, ReadCount, WriteCount, JsonCode, TagList from NoteTable COLLATE natsort;
So aufjedenfall NICHT.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SQLite - Natürliche Sortierung?

Beitrag von pluto »

Problem scheinbar gelöst:

Code: Alles auswählen

select id, Title, CreateDateTime, LastWriteDateTime, LastReadDateTime, ReadCount, WriteCount, JsonCode, TagList from NoteTable order BY Title COLLATE mixed;
Im Plugin steht:

Code: Alles auswählen

rc = sqlite3_create_collation(db, "mixed", SQLITE_UTF8, 0, mixedCollFunc);
"mixed" ist hier wohl der Funktions Name. Nun ist die sotierung, wie ich sie haben möchte.
MFG
Michael Springwald

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SQLite - Natürliche Sortierung?

Beitrag von sstvmaster »

Danke Michael.

Kannst du eventuell ein kleines HowTo schreiben wie das Plugin geladen wird (Windows, Linux) und wie man das Plugin erstellt und was dort im Plugin stehen muss?
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SQLite - Natürliche Sortierung?

Beitrag von pluto »

sstvmaster hat geschrieben:Kannst du eventuell ein kleines HowTo schreiben wie das Plugin geladen wird (Windows, Linux) und wie man das Plugin erstellt und was dort im Plugin stehen muss?
Kann ich gerne versuchen.
1. Ich habe dein Link genommen:
https://sqlite.org/forum/forumpost/35fb771227?t=h

Ich packe einfach mal die *.c Datei in den Anhang.
Die .txt Datei einfach nach .c umbennen: Das Forum hat leider was gegen .c Dateien.
(Ich hoffe die Datei ist jetzt hoch geladen, es wurde leider keine "Liste" erstellt oder sonstige Rückmeldung gegeben !).

2. https://www.sqlite.org/loadext.html#com ... _extension
Hier steht:
gcc -g -fPIC -shared YourCode.c -o YourCode.so
das habe ich so abgehändert:
gcc -g -fPIC -shared mixedcoll.c -o mixedcoll.so

Bei mir konnte er das Problemlos kompilieren.
Anschließend habe ich die Datei nach: /usr/lib/sqlite3/ kopiert:
sudo cp mixedcoll.so /usr/lib/sqlite3/

3. Geladen wird sie:
SQlConnector.LoadExtension('/usr/lib/sqlite3/mixedcoll.so');
Nach dem die DB geladen wurde.

4. Angewendet wird sie:

Code: Alles auswählen

  SQLQuery.Clear;
  SQLQuery.SQL.Text:='select id, Title, CreateDateTime, LastWriteDateTime, LastReadDateTime, ReadCount, WriteCount, JsonCode, TagList from NoteTable order BY Title COLLATE mixed;';
  SQLQuery.Open;
Ich hoffe das hilft.
Dateianhänge
mixedcoll.txt
Datei Endung ändern nach .c
(1.56 KiB) 77-mal heruntergeladen
MFG
Michael Springwald

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: SQLite - Natürliche Sortierung?

Beitrag von charlytango »

man lernt doch auch als altes Zirkuspferd immer noch dazu.

'Natürliche Sortierung' war mir doch tatsächlich neu. 8)

aber ein Beispiel auch für SQLite wurde früher schon diskutiert:
https://www.access-o-mania.de/forum/ind ... ic=21644.0

Verschiedenste Lösungsvarianten inklusive Herumfummeln in der SQLiteDB gipfeln letztlich auch in dem Ansatz der schon seit dBase2 funktioniert (früher haben wir das mit SOUNDEX so gemacht):
Wenn man eine Sortierung braucht die es nicht oder nicht ausreichend gibt dann baut man sich eben ein Feld in dem der String so steht wie er sortiert werden soll. (das ist ja abhängig vom erwarteten Inhalt)
Ob in der gleichen Tabelle oder einer Referenztabelle ist dann nur mehr Optik (oder Berechtigungsrelevant)

Und dieses Feld wird beim Speichern in die Tabelle erstellt. Wahlweise als Trigger (Insert und Update) oder direkt vom Programm beim Schreiben in die DB. Wobei ich letzteres bevorzugen würde, denn das lässt sich leicht auf andere DBMs mitnehmen.

gegen die Eleganz der Lösung von pluto kann ich nicht an ... außer man möchte mal die DB wechseln
Zuletzt geändert von charlytango am So 4. Apr 2021, 16:19, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SQLite - Natürliche Sortierung?

Beitrag von pluto »

charlytango hat geschrieben:Wenn man eine Sortierung braucht die es nicht oder nicht ausreichend gibt dann baut man sich eben ein Feld in dem der String so steht wie er sortiert werden soll. (das ist ja abhängig vom erwarteten Inhalt)
Darauf bin ich auch gestoßen, konnte es aber für mich nicht Anwenden, weil ich damit nicht anfangen konnte.
Ich finde, die Lösung, die ich jetzt habe, erst mal OK, ich frage mich nur, warum es sowas nicht per Default in SQLite gibt?
Bin ja bestimmt nicht der Einzigste, der eine Natürliche Sortierung möchte oder?
MFG
Michael Springwald

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SQLite - Natürliche Sortierung?

Beitrag von sstvmaster »

Ja das verstehe ich auch nicht warum das in SQLite noch nicht drin ist.

Dann würde jetzt nur noch die Windows dll fehlen.

Vielen Dank für deine Arbeit Michael.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SQLite - Natürliche Sortierung?

Beitrag von pluto »

sstvmaster hat geschrieben:Dann würde jetzt nur noch die Windows dll fehlen.
Vielen Dank für deine Arbeit Michael.
Bitte, unter Windows musst du .so natürlich nach .dll ändern.
Ich denke, sonst sollte es Kompatibel sein.
Kannst ja mal schreiben, wie du es unter Windows Kompiliert hast, dann passe ich mein Beitrag an.
MFG
Michael Springwald

Antworten