Sortierung nach wichtigkeit der Produktsprache

Hallo,

ich versuche gerade eine Lösung zu finden wie ich ISO Sprachkürzel (ger, eng, fre, span, usw.) in eine von mir gewünschte Reihenfolge sortieren kann. Als Beispiel soll mal die Reihenfolge oben in den Klammern dienen.

Gebraucht wird das für eine Produktsuchfunktion. Es wird mit tsearch2 in der Titelspalte nach dem Stichwort gesucht. Die gefundenen Treffer sollen dann nach dem in einer anderen Tabelle hinterlegten Sprachkürzel in nicht alphabetischer Reihenfolge sortiert werden.

Mir fehlt im moment die Zündende Idee wie ich sowas machen könnte. Beim Suchen habe ich zwar regexp_replace gefunden. Regex ist aber nicht grad mein Fachgebiet :-(. Mein gedanke war die Kürzel durch Nummern zu ersetzen die dann entsprechend sotiert werden. Was aber vermutlich viel Rechenzeit kostet.

Vielleicht hat ja jemand eine andere Idee (CPU schonend) oder ein Beispiel wie mit Regex sowas aussieht.

Beste Grüße
Alexander

Du könntest zu deiner Tabelle eine weitere Spalte addieren, die einen Sortierwert enthält. Dann kannst du die Ausgabe anhand dieses Wertes sortieren …

Danke für die schnelle Antwort die Idee ist gut aber ich würde lieber eine Lösung verwenden die nicht in der Tabelle gespeichert wird und sozusagen statisch ist.

Warum nicht ist leicht erklärt: Die Suchfunktion muß für verschiedene Länder arbeiten und da hat jedes Land natürlich die priorität auf der Landessprache. Der Suchfunktion wird das Land beim Aufruf als Parameter übergeben und dann sollen die Ergebnisse entsprechend dem Land zurückgegeben werden.

Am liebsten wäre mir eine Lösung die ich in meiner SQL-Abfrage unterbringen kann und keine weiteren externen Daten brauche. Ob das realistisch ist, hm… vermutlich nicht da es doch sehr viele vorkommende Kürzel gibt.

Wenn mit einer externen Daten dann in einer eigenen Tabelle so nach dem prinzip:
<Sprachkürzel><Priorität>.
Aber wie sortiert man mit einer zusätzlichen Tabelle?
Hm…, mit einem join, sehe ich das richtig.

Alexander

Bitteschön:

test=*# select * from foo;
  f
------
 ger
 fre
 eng
 usw
 span
(5 rows)

Time: 1.087 ms
test=*# select f from foo order by case when f='ger' then 1 when f='eng' then 2 when f='fre' then 3 when f='span' then 4 when f='usw' then 5 end;
  f
------
 ger
 eng
 fre
 span
 usw
(5 rows)

Andreas

Das funktioniert, würde ich aber mal noch auf Performance Fragen abklopfen … durch die vielen CASE wird das ev. langsam.

Sicher, da hilft auch kein Index. Aber Deine, bessere Lösung gefiel ja dem Fragesteller nicht…

Andreas

Nix anderes hat ads Dir vorgeschlagen.

Aber wie sortiert man mit einer zusätzlichen Tabelle?
Hm…, mit einem join, sehe ich das richtig.

Alexander

Ja, man kann das auch von hinten durch die Brust ins Knie machen:

test=*# create table f_sort (f text, s int);
CREATE TABLE
test=# copy f_sort from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> ger  1
>> eng  2
>> fre  3
>> span 4
>> usw  5
>> \.

test=# select foo.f from foo join f_sort s using (f) order by s.s;
  f
------
 ger
 eng
 fre
 span
 usw
(5 rows)

Und um nun noch die eigene Landessprache zu bevorzugen, kanst Du auch hier mit CASE arbeiten:

-- angenommen, die Sprache 'usw' sei unsere Muttersprache
test=*# select foo.f from foo join f_sort s using (f) order by case when foo.f = 'usw' then 0 else s.s end;
  f
------
 usw
 ger
 eng
 fre
 span
(5 rows)

Damit hast Du Dein Ziel, die Sortierung in einer extra Tabelle zu haben, erreicht. Für den Preis eines extra joins, ansonsten ist es exakt ads seine Lösung.


Andreas

Auf die Idee in einem “order by” einen case zu verwenden bin ich noch gar nicht gekommen und dass das mit der zusätzlichen Tabelle nur eine Variation der von ads vorgeschlagenen Lösung ist mir schon klar.

Es ist sicher ein Umweg aber mit einer eigenen Tabelle habe ich halt die flexibilität für jedes Land eine vollständig eigene Sortierreihenfolge festlegen zu können. Auserdem trenne ich so diese Information von den restlichen Daten die ja sehr häufig gelöscht und neu importiert werden und ich dann immer bei jedem Datensatz die Sortierinformation mitpflegen müsste. Ich werde mal testen wie sich die verschiedenen Lösungen verhalten und dann entscheiden welche ich baue.

Alexander