PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Padrões de correspondência entre várias colunas


As respostas até agora não atendem à sua pergunta:

Não faz diferença se você usa LIKE ou = contanto que você corresponda a toda a string (e não haja nenhum caractere curinga em sua corda). Para tornar a pesquisa confusa, você precisa substituir parte do padrão, não apenas adicionar a ele.

Por exemplo, para corresponder aos últimos 7 (em vez de 8) caracteres da subcolumn :
SELECT *
FROM   maintable m
WHERE  left(maincolumn, 8) LIKE 
       ( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));

Eu uso o left() mais simples (introduzido com o Postgres 9.1).
Você could simplifique isso para:
SELECT *
FROM   maintable m
WHERE  left(maincolumn, 7) =
       (SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);

Mas você não faria isso se usasse o índice especial que mencionei mais abaixo, porque as expressões em índices funcionais precisam corresponder precisamente para serem úteis.

Você pode estar interessado na extensão pg_tgrm .

No PostgreSQL 9.1, execute uma vez por banco de dados:
CREATE EXTENSION pg_tgrm;

Duas razões:

  • Ele fornece o operador de similaridade % . Com ele você pode construir uma pesquisa de similaridade inteligente:
    --SELECT show_limit();
    SELECT set_limit(0.5); -- adjust similarity limit for % operator
    
    SELECT *
    FROM maintable m
    WHERE left(maincolumn, 8) %
          (SELECT subcolumn FROM subtable WHERE subid = 2);
    

  • Ele fornece suporte de índice para ambos LIKE e %

    Se o desempenho de leitura for mais importante do que o desempenho de gravação, sugiro que você crie um funcional Índice GIN ou GiST como este:
    CREATE INDEX maintable_maincol_tgrm_idx ON maintable
    USING gist (left(maincolumn, 8) gist_trgm_ops);
    

    Este índice oferece suporte a qualquer consulta. Esteja ciente de que ele vem com algum custo para operações de gravação.
    Uma referência rápida para um caso semelhante nesta resposta relacionada .