PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dopasowywanie wzorców między wieloma kolumnami

Dotychczasowe odpowiedzi nie odpowiadają na Twoje pytanie:

Nie ma prawie żadnej różnicy, czy używasz LIKE lub = tak długo, jak pasujesz do całego ciągu (i nie ma znaku wieloznacznego w Twój ciąg). Aby wyszukiwanie było rozmyte, musisz zamienić częścią wzoru, a nie tylko do niego dodawaj.

Na przykład, aby dopasować ostatnie 7 (zamiast 8) znaków w subcolumn :

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

Używam prostszego left() (wprowadzony w Postgresie 9.1).
Ty could uprość to do:

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

Ale nie zrobiłbyś tego, gdybyś używał specjalnego indeksu, o którym wspomniałem poniżej, ponieważ wyrażenia w indeksach funkcjonalnych muszą być dokładnie dopasowane, aby były użyteczne.

Być może zainteresuje Cię rozszerzenie pg_tgrm .

W PostgreSQL 9.1 uruchom raz na bazę danych:

CREATE EXTENSION pg_tgrm;

Dwa powody:

  • Dostarcza operator podobieństwa % . Dzięki niemu możesz zbudować inteligentne wyszukiwanie podobieństw:

    --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);
    
  • Zapewnia obsługę indeksowania dla obu LIKE i %

    Jeśli wydajność odczytu jest ważniejsza niż wydajność zapisu, sugeruję utworzenie funkcjonalny Indeks GIN lub GiST w następujący sposób:

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

    Ten indeks obsługuje oba zapytania. Pamiętaj, że wiąże się to z pewnymi kosztami operacji zapisu.
    Szybki test porównawczy dla podobnego przypadku w tej powiązanej odpowiedzi .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Musisz zainstalować postgresql-server-dev-X.Y do budowania rozszerzenia po stronie serwera lub libpq-dev do budowania aplikacji po stronie klienta

  2. Eksportowanie danych zawierających linie jako CSV z PostgreSQL

  3. Jak udostępnić tabelę między wieloma bazami danych Postgresql

  4. Jak Atanh() działa w PostgreSQL

  5. Serwery rozproszone geograficznie, PostgreSQL i JPA