Mam prostą listę ~ 25 słów. Mam pole varchar w PostgreSQL, powiedzmy, że jest to lista ['foo', 'bar', 'baz']
. Chcę znaleźć dowolny wiersz w mojej tabeli, który zawiera którekolwiek z tych słów. To zadziała, ale chciałbym coś bardziej eleganckiego.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
sql
postgresql
chmullig
źródło
źródło
SIMILAR TO
jest wewnętrznie tłumaczone na wyszukiwanie wyrażeń regularnychlower()
jest nieskuteczne, ponieważ najpierw konwertuje każdy ciąg na małe litery, co jest bardziej kosztowne niż tylko dopasowaniePostgreSQL obsługuje również pełne wyrażenia regularne POSIX :
Jest
~*
to dopasowanie bez rozróżniania wielkości liter, rozróżnia wielkość liter~
.Inną opcją jest użycie DOWOLNEGO :
Możesz użyć DOWOLNEGO z dowolnym operatorem, który zwraca wartość logiczną. Podejrzewam, że opcje regex byłyby szybsze, ale KAŻDY jest przydatnym narzędziem, które należy mieć w swoim zestawie narzędzi.
źródło
Właściwie jest do tego operator w PostgreSQL:
źródło
~~
jest po prostu inna nazwalike
: „Operator~~
odpowiadaLIKE
, a~~*
odpowiadaILIKE
Istnieją również.!~~
i!~~*
podmioty, które reprezentująNOT LIKE
iNOT ILIKE
odpowiednio Wszystkie te podmioty są specyficzne dla PostgreSQL.”. . I'{%foo%,%bar%,%baz%}'
jest formą tekstowąarray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
konwertuje na wyrażenie regularne,~
operator oznacza wyrażenie regularne POSIX, ale nie jest to jasne dlaLIKE
.Jednym „eleganckim” rozwiązaniem byłoby użycie wyszukiwania pełnotekstowego: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Następnie należy użyć zapytań wyszukiwania pełnotekstowego.
źródło