Ich möchte eine Datenbank von MS SQLServer nach PostgreSQL migrieren und benötige mal Hilfe zur Suche in varchar Spalten.
Ich habe eine große Personaltabelle, die üblicherweise in etwa folgender Art abgefragt wird:
Code:
select * from personal where nachname like 'mei%' and vorname like 'han%'
In der Tabelle kann es Herrn Meier geben aber auch Herrn MEIER usw., beide sollten gefunden werden. Und ich kann auch nicht beeinflussen, ob der Benutzer nun nach Mei% oder mei% sucht.
In der Dokumentation fand ich, dass ich zunächst ilike anstelle von like benutzen sollte. Weiterhin fand ich, dass man bei einer anderen als der C-Locale für die Suche mit like einen Index mit varchar_pattern_ops erstellen muß und dass ilike intern lower verwendet.
Nun habe ich folgenden index erstellt:
Code:
CREATE INDEX ix_personal_nachname
ON personal
USING btree
(lower(nachname) varchar_pattern_ops)
TABLESPACE idx;
Ich habe auch andere Varianten probiert (upper(), lower(), ohne den speziellen Operator usw.) Aber ich sehe immer nur talescans, irgendwo ist da der Wurm drin.
Was ich vermeiden möchte, ist etwas in der Art upper(value) like upper(column) o.ä denn das Problem betrifft nicht nur die Suche in der Personaltabelle und ich müßte dann sehr viele Abragen umschreiben.
Wie ist in diesem Falle das beste Vorgehen? Wie erstellt man den Index passend zur Abfrage?
Pitti
Lesezeichen