Ich habe eine einfache Liste von ~ 25 Wörtern. Ich habe ein varchar-Feld in PostgreSQL. Nehmen wir an, die Liste ist ['foo', 'bar', 'baz']
. Ich möchte eine Zeile in meiner Tabelle finden, die eines dieser Wörter enthält. Das wird funktionieren, aber ich hätte gerne etwas eleganteres.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
Du kannst Postgres ' SIMILAR TO
Operator, der Alternativen unterstützt, d.h.
select * from table where lower(value) similar to '%(foo|bar|baz)%';
PostgreSQL unterstützt auch volle POSIX reguläre Ausdrücke :
select * from table where value ~* 'foo|bar|baz';
Das ~*
ist für eine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung, ~
unterscheidet zwischen Groß- und Kleinschreibung.
Eine andere Option ist ANY :
select * from table where value like any (array['%foo%', '%bar%', '%baz%']);
select * from table where value ilike any (array['%foo%', '%bar%', '%baz%']);
Sie können ANY mit jedem Operator verwenden, der einen Booleschen Wert liefert. Ich vermute, dass die Regex-Optionen schneller wären, aber ANY ist ein nützliches Werkzeug in Ihrer Toolbox.
Tatsächlich gibt es dafür in PostgreSQL einen Operator:
SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');
Eine "elegante" Lösung wäre die Verwendung der Volltextsuche: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Dann würden Sie Volltextsuchanfragen verwenden.