sql >> Database teknologi >  >> RDS >> PostgreSQL

Matchende mønstre mellem flere kolonner

Svarene hidtil ikke besvarer dit spørgsmål:

Det gør næppe nogen forskel, om du bruger LIKE eller = så længe du matcher hele strengen (og der er ingen jokertegn i). din streng). For at gøre søgningen uklar, skal du erstate en del af mønsteret, ikke bare tilføje til det.

For eksempel at matche de sidste 7 (i stedet for 8) tegn i subcolumn :

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

Jeg bruger den enklere left() (introduceret med Postgres 9.1).
Du could forenkle dette til:

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

Men det ville du ikke, hvis du bruger det specielle indeks, jeg nævner længere nede, fordi udtryk i funktionelle indekser skal matches præcist for at være til brug.

Du kan være interesseret i udvidelsen pg_tgrm .

I PostgreSQL 9.1 køres én gang pr. database:

CREATE EXTENSION pg_tgrm;
 

To grunde:

  • Den leverer lighedsoperatoren % . Med den kan du bygge en smart lighedssøgning:

    --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);
  • Det giver indeksstøtte for begge LIKE og %

    Hvis læseydelse er vigtigere end skriveydelse, foreslår jeg, at du opretter en funktionel GIN- eller GiST-indeks som dette:

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

    Dette indeks understøtter begge forespørgsler. Vær opmærksom på, at det medfører nogle omkostninger til skriveoperationer.
    En hurtig benchmark for en lignende sag i dette relaterede svar .



  1. Hvordan bruger man uuid med postgresql gist indekstype?

  2. MySQL-forberedte erklæringer

  3. Hvornår skal man vælge Oracle frem for MySQL?

  4. Hvordan gemmer man flere muligheder i en enkelt tabel?