Não há nenhuma maneira .
Índices requerem
IMMUTABLE
expressões. O resultado da sua expressão depende da string de entrada. Não vejo outra maneira de avaliar a expressão para cada linha, ou seja, uma varredura sequencial. Resposta relacionada com mais detalhes para o
IMMUTABLE
ângulo:Só que não há solução para o seu caso, o que é impossível para indexar. O índice precisa armazenar valores constantes em suas tuplas, o que simplesmente não está disponível porque o valor resultante para cada linha é calculado com base na entrada. E você não pode transformar a entrada sem olhar para o valor da coluna.
O uso do índice Postgres está vinculado a operadores e apenas índices em expressões esquerda do operador pode ser usado (devido às mesmas restrições lógicas). Mais:
Muitos operadores definem um
COMMUTATOR
que permite que o planejador/otimizador de consultas inverta as expressões indexadas para a esquerda. Exemplo simples:o comutador de =
é =
. o comutador de >
é <
e vice versa. A documentação:
O operador de correspondência de expressão regular
~
não tem comutador, novamente, porque isso não é possível. Veja por si mesmo:SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
FROM pg_operator
WHERE oprname = '~'
AND 'text'::regtype IN (oprright, oprleft);
oprname | oprright | oprleft | oprcom
---------+----------+-----------+------------
~ | text | name | 0
~ | text | text | 0
~ | text | character | 0
~ | text | citext | 0
E consulte o manual aqui:
Eu tentei antes e tive que aceitar que é impossível em princípio .