Conhecendo o operador SimilarTo do PostgreSQL

Olá Amigos!

Prazer em revê-los novamente aqui no blog, e inicialmente eu gostaria de agradecer a audiência que vem crescendo a cada mês! Já estamos indo para 7 meses de blog e meus posts sobre o PostgreSQL estão sendo bem recebidos pela comunidade! Meu muito obrigado a vocês que fazem o blog acontecer!

Tratando agora do nosso assunto, em um post anterior sobre a utilização do operador iLIKE eu mencionei a particularidade do Postgres em realizar buscas discernindo os caracteres upper-case de low-case, no entanto há também a possibilidade de inserir expressões regulares a fim de refinar a busca, e para tal utilizamos o operador Similar To.

Para ilustrar o funcionamento desse operador, tome como base este problema: “Recuperar o nome das pessoas que terminam em “Silva” ou “Souza”. Aqui vocês irão me dizer que poderíamos utilizar os operados que já conhecemos como o LIKE e o iLIKE, e claro que sim, poderíamos e inclusive eu fiz algumas comparações com o desempenho, veja só:

SELECT * FROM pessoas WHERE sobrenome LIKE '%SILVA' OR sobrenome LIKE '%SOUZA' -- Gastou 150 ms com 1961 resultados
SELECT * FROM pessoas WHERE sobrenome iLIKE '%silva' OR sobrenome iLIKE '%souza' -- Gastou 250 ms com 1961 resultados
SELECT * FROM pessoas WHERE sobrenome SIMILAR TO '(%SILVA|%SOUZA)' -- Gastou 350 ms com 1961 resultados
SELECT * FROM pessoas WHERE sobrenome SIMILAR TO '%(SILVA|SOUZA)' -- Gastou 300 ms com 1961 resultados

Pelo menos aqui nos meus testes o Similar To se mostrou o operador mais lento, apesar de não existir nenhuma referência sobre o desempenho dele no manual. Por natureza isso se deve acontecer porque ele mescla o funcionamento dos outros operadores testados com a implementação e expressões regulares POSIX. Eu não encontrei uma maneira de fazer o Similar To funcionar como o iLIKE, então se alguém tiver alguma sugestão sinta-se livre para comentar =)

Listei aqui abaixo os artivicios que você utlilizar para realizar junto com o Similar To como está no manual do Postgres:

  • | representa alternância (uma das duas alternativas).
  • * representa a repetição do item anterior zero ou mais vezes.
  • + representa a repetição do item anterior uma ou mais vezes.
  • Os parênteses () podem ser utilizados para agrupar itens em um único item lógico.
  • A expressão de colchetes […] especifica uma classe de caracteres, do mesmo modo que na expressão regular POSIX.

Seria muito interessante você dar uma lida no Manual do Postgres, lá você irá encontrar material mais completo, nas referências abaixo você tem o link que está em inglês, se preferir aqui está a versão em português, só que da versão 8.0 (apensar da versão em inglês não mudar muita coisa).

Referências:

Abraços,

Tiago.

Add a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *