Ich habe eine einfache Liste von ~ 25 Wörtern. Ich habe ein Varchar-Feld in PostgreSQL, sagen wir, diese 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%')
sql
postgresql
chmullig
quelle
quelle
SIMILAR TO
wird intern in eine Regex-Suche übersetztlower()
ist ineffektiv, da sie zuerst jede Zeichenfolge in Kleinbuchstaben umwandelt, was teurer ist als nur eine ÜbereinstimmungPostgreSQL unterstützt auch reguläre POSIX-Ausdrücke :
Das
~*
ist für eine Übereinstimmung ohne Berücksichtigung der~
Groß- und Kleinschreibung.Eine andere Option ist die Verwendung von ANY :
Sie können ANY mit jedem Operator verwenden, der einen Booleschen Wert ergibt. Ich vermute, dass die Regex-Optionen schneller wären, aber JEDES ist ein nützliches Werkzeug, das Sie in Ihrer Toolbox haben sollten.
quelle
Tatsächlich gibt es dafür in PostgreSQL einen Operator:
quelle
~~
ist nur ein anderer Name fürlike
: „Der Betreiber~~
äquivalent istLIKE
, und~~*
entsprichtILIKE
Darüber hinaus gibt es.!~~
und!~~*
Operatoren , die darstellenNOT LIKE
undNOT ILIKE
PostgreSQL-spezifische bzw. All diese Operatoren sind..“ . Und'{%foo%,%bar%,%baz%}'
ist die Textform vonarray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
konvertiert in regulären Ausdruck,~
Operator steht für POSIX Regular Expression, aber dies ist nicht klar fürLIKE
.Eine "elegante" Lösung wäre die Verwendung der Volltextsuche: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Dann würden Sie Volltextsuchabfragen verwenden.
quelle