Hallo Postgresql-Experten,

Steckte bei order by von postgresql fest, da Daten hier von pgAdmin so sensibel eingefügt werden.

enter image description here

Wie Sie auf dem Bild sehen können, kommt "Les" zuerst und "L." kommt nach. Eigentlich "L." sollte zuerst kommen und dann "Les". "L." kommt auch in wenigen Spalten, aber nicht sortiert. Also eine Idee, warum das passiert?

Dies ist die Definition der Tabelle (Namensspalte):

CREATE TABLE public.res_partner
(
  id integer NOT NULL DEFAULT nextval('res_partner_id_seq'::regclass),
  name character varying,
  .....
  .....

Hier ist der Index, der für die Namensspalte für diese Tabelle erstellt wurde.

CREATE INDEX res_partner_name_index
  ON public.res_partner
  USING btree
  (name COLLATE pg_catalog."default");

Vielen Dank im Voraus für die Hilfe!

2
Hardikgiri Goswami 26 Juni 2019 im 21:49

3 Antworten

Beste Antwort

PostgreSQL verwendet Bibliotheken vom Betriebssystem zur Unterstützung lokaler Sprachen. Wenn Sie die Klausel ORDER BY ohne die Klausel COLLATE verwenden, verwendet Postgres die Standardkollatierung - Sie können sie mit dem Befehl SHOW lc_collate anzeigen. Der Index ist nur für die Beschleunigung der ORDER BY -Klausel wichtig. Die Bestellung hat keinen Einfluss. Einige Gebietsschemas können eine andere Reihenfolge als erwartet verwenden.

Sie können auf das Ergebnis schauen:

SELECT datname, datcollate FROM pg_database;

Wenn Sie ein anderes Gebietsschema erwarten, verwenden Sie a) COLLATE clause nach ORDER BY, b) erstellen Sie eine Datenbank mit einem anderen Gebietsschema durch Dump / Load neu.

5
Pavel Stehule 26 Juni 2019 im 19:05

Ich denke, Sie können dies lösen, indem Sie eine andere Sortierung verwenden:

ORDER BY name COLLATE "C"

Wenn der Index diese Abfrage unterstützen soll, definieren Sie ihn mit derselben Sortierung.

4
Laurenz Albe 26 Juni 2019 im 19:05

Wenn Sie sich Ihr Bild ansehen, scheint es, dass ORDER BY keine Punkte oder Leerzeichen berücksichtigt und direkt zum nächsten verfügbaren Buchstaben übergeht. Der sauberste Weg, wie ich damit umgehen kann, ist:

  1. Teilen Sie name in drei Spalten auf: erste, mittlere und letzte.
  2. Entfernen Sie alle Punkte und Leerzeichen.
  3. Bestellung nach letzter, erster, mittlerer.
0
Abe 26 Juni 2019 im 19:03