Umlaute und Regular Expressions

Hallo,

Ich habe eine Datenbank mit Produkten. Diese Produkte haben einen Namen. Für einen Webauftritt möchte ich einen Index dieser Produkte erstellen. Das heißt ich möchte sie anhand ihrer Anfangsbuchstaben aufgelistet sehen. Dabei sollen Alle Produkte mit Ä auch unter A aufgelistet werden. Gleiches gilt für andere Umlaute. Ein weiteres Problem sind franz. Sonderzeichen.

Nun möchte ich beispielsweise alle Produkte, deren Name mit einem ‘A’, ‘Ä’ oder À beginnen, haben.

SELECT name FROM products WHERE (name ~* ‘^A’) ORDER BY name ASC;

liefert jedoch nur alle produkte die mit A beginnen.

Gibt es eine einfache Möglichkeit wie ich auch die entsprechenden Umlaute in meiner Auflistung erhalte ohne folgendes zu schreiben zu müssen?

SELECT name FROM products WHERE (name ~* ‘^A’) OR (name ~* ‘^Ä’) OR (name ~* ‘^À’) ORDER BY name ASC;

Hilft Unicode base char oder sowas? (Msg-ID: <45F6876E.3: msg#00040 weiter?

Andreas

Ja das geht in die richtige Richtung leider verstehe ich nicht ganz wie ich es umsetzen kann.

Nun, eine Funktion schreiben, die das macht, und dann verwenden. Schnell-Beispiel:

test=# create table u (t text);
CREATE TABLE
test=*# insert into u values ('foo');
INSERT 0 1
test=*# insert into u values ('bar');
INSERT 0 1
test=*# create or replace function change_first_char(text) returns text as $$begin if substring($1,1,1)='f' then return 'b'|| substring($1,2,100); end if; return $1; end; $$language plpgsql immutable strict;
CREATE FUNCTION
test=*# select * from u where change_first_char(t) ~ '^b.*';
  t
-----
 foo
 bar
(2 rows)

In der Funktion dann halt die einzelnen Buchstaben abklappern. Dazu ließe sich sogar ein funktionaler Index bilden.

Andreas

Ok,

habs jetzt verstanden. Werde es gleich einmal umsetzen.
Ich hatte nur gedacht es gäbe unter PostgreSQL eine eingebaute Funktion die die Umwandlung durchführt. Schließlich werden beim sortieren von Strings Umlaute ja automatisch korrekt sortiert ohne das ich Umlaute umwandeln muss.


Vielen Dank für die schnelle Hilfe!