webentwicklung-frage-antwort-db.com.de

PostgreSQL-Platzhalter LIKE für ein beliebiges Wort aus einer Liste von Wörtern

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%')
128
chmullig

Du kannst Postgres ' SIMILAR TO Operator, der Alternativen unterstützt, d.h.

select * from table where lower(value) similar to '%(foo|bar|baz)%';
133

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.

196
mu is too short

Tatsächlich gibt es dafür in PostgreSQL einen Operator:

SELECT *
FROM table
WHERE lower(value) ~~ ANY('{%foo%,%bar%,%baz%}');
7
jlandercy

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.

1
Kalendae