Acabei de descobrir que alguns padrões específicos quando usados com o operador de texto LIKE usam índices BTREE para acelerar as consultas, como:
- 'abc123' (texto sem curinga)
- 'abc%' (texto com apenas um curinga no final)
Qual é o equivalente do operador de texto LIKE usando um padrão com apenas um curinga '%'
presente no final do padrão (como "a_column" LIKE 'abc%'
) usando apenas operadores maiores/menores/iguais?
Meu interesse é conseguir isso no PostgreSQL, mas essa pode ser uma pergunta padrão do SQL.
Em geral, não há como substituir uma pesquisa curinga por operações
>=
e<
. Considere este exemplo:Portanto, em tcheco, não há como substituir
LIKE 'abc%'
os operadores regulares de desigualdade.A única ordenação em que isso sempre funciona é a ordenação binária
C
(ouPOSIX
). Alternativamente, você pode usar os operadores de desigualdade~>=~
e~<~
, que comparam strings caractere por caractere.Por que você não usa a solução adequada e cria um índice como este:
Esse índice pode acelerar as duas
LIKE
expressões e não há necessidade de reescrever a consulta."a_column" >= 'abc' AND "a_column" < 'abd'
deve ser equivalente a"a_column" LIKE 'abc%'
-'abc'
corresponderá porque é igual ao termo de pesquisa e qualquer string que comece comabc
será maior que ele, mas menor queabd
.Isso supondo que seu agrupamento esteja definido de forma que você obtenha uma comparação binária, você precisará de algum pensamento extra para fazer as coisas funcionarem conforme desejado com comparações que não diferenciam maiúsculas de minúsculas ou não diferenciam acentos.