Eu tenho uma lista simples de ~ 25 palavras. Eu tenho um campo varchar no PostgreSQL, digamos que a lista seja ['foo', 'bar', 'baz']
. Quero encontrar qualquer linha na minha tabela que contenha alguma dessas palavras. Isso vai funcionar, mas eu gostaria de algo mais elegante.
select *
from table
where (lower(value) like '%foo%' or lower(value) like '%bar%' or lower(value) like '%baz%')
sql
postgresql
chmullig
fonte
fonte
SIMILAR TO
é traduzido internamente para uma pesquisa regexlower()
é ineficaz porque ele vai primeiro converter cada cadeia para minúsculas, que é mais caro do que apenas uma combinação case-insensitiveO PostgreSQL também suporta expressões regulares completas do POSIX :
O
~*
é para uma correspondência que não diferencia maiúsculas de minúsculas, diferencia~
maiúsculas de minúsculas.Outra opção é usar QUALQUER :
Você pode usar QUALQUER com qualquer operador que produz um booleano. Eu suspeito que as opções de regex seriam mais rápidas, mas QUALQUER é uma ferramenta útil para ter em sua caixa de ferramentas.
fonte
Na verdade, existe um operador para isso no PostgreSQL:
fonte
~~
é apenas outro nome paralike
: "O operador~~
é equivalente aLIKE
, e~~*
corresponde àILIKE
Existem também.!~~
e!~~*
operadores que representamNOT LIKE
eNOT ILIKE
, respectivamente Todos estes operadores são específicos do PostgreSQL.". . E'{%foo%,%bar%,%baz%}'
é a forma de texto dearray['%foo%', '%bar%', '%baz%']
.SIMILAR TO
converter em Expressão regular, o~
operador significa Expressão regular POSIX, mas isso não está claroLIKE
.Uma solução 'elegante' seria usar a pesquisa de texto completo: http://www.postgresql.org/docs/9.0/interactive/textsearch.html . Então você usaria consultas de pesquisa de texto completo.
fonte