sql >> Base de Datos >  >> RDS >> PostgreSQL

Coincidencia de patrones entre varias columnas

Las respuestas hasta ahora no abordan su pregunta:

Apenas hace ninguna diferencia si usa LIKE o = siempre y cuando coincida con toda la cadena (y no haya ningún carácter comodín en su cadena). Para que la búsqueda sea confusa, debe reemplazar parte del patrón, no solo agregarlo.

Por ejemplo, para hacer coincidir los últimos 7 (en lugar de 8) caracteres de subcolumn :

SELECT *
FROM   maintable m
WHERE  left(maincolumn, 8) LIKE 
       ( '%' || left((SELECT subcolumn FROM subtable WHERE subid = 2), 7));

Uso el left() más simple (introducido con Postgres 9.1).
Usted could simplifica esto a:

SELECT *
FROM   maintable m
WHERE  left(maincolumn, 7) =
       (SELECT left(subcolumn,7) FROM subtable WHERE subid = 2);

Pero no lo haría si usa el índice especial que menciono más adelante, porque las expresiones en los índices funcionales tienen que coincidir con precisión para ser útiles.

Puede que te interese la extensión pg_tgrm .

En PostgreSQL 9.1, ejecute una vez por base de datos:

CREATE EXTENSION pg_tgrm;

Dos razones:

  • Proporciona el operador de similitud % . Con él puedes construir una búsqueda de similitud 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);
    
  • Proporciona compatibilidad con índices para ambos LIKE y %

    Si el rendimiento de lectura es más importante que el rendimiento de escritura, le sugiero que cree un funcional Índice GIN o GiST como este:

    CREATE INDEX maintable_maincol_tgrm_idx ON maintable
    USING gist (left(maincolumn, 8) gist_trgm_ops);
    

    Este índice admite cualquier consulta. Tenga en cuenta que las operaciones de escritura tienen un costo.
    Un punto de referencia rápido para un caso similar en esta respuesta relacionada .