sql >> Database >  >> RDS >> PostgreSQL

Overeenkomende patronen tussen meerdere kolommen

De antwoorden tot nu toe beantwoorden niet aan uw vraag:

Het maakt nauwelijks uit of je LIKE . gebruikt of = zolang je de hele string matcht (en er zijn geen jokertekens in je snaar). Om de zoekopdracht vaag te maken, moet u vervangen deel van het patroon, niet alleen toevoegen.

Bijvoorbeeld om overeen te komen met de laatste 7 (in plaats van 8) tekens van subcolumn :

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

Ik gebruik de eenvoudigere left() (geïntroduceerd met Postgres 9.1).
U could vereenvoudig dit tot:

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

Maar dat zou je niet doen als je de speciale index gebruikt die ik verderop vermeld, omdat uitdrukkingen in functionele indexen precies moeten matchen om bruikbaar te zijn.

Mogelijk bent u geïnteresseerd in de extensie pg_tgrm .

Voer in PostgreSQL 9.1 eenmaal per database uit:

CREATE EXTENSION pg_tgrm;

Twee redenen:

  • Het levert de overeenkomstoperator % . Hiermee kunt u een slimme zoekopdracht naar overeenkomsten bouwen:

    --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);
    
  • Het levert indexondersteuning voor beide LIKE en %

    Als leesprestaties belangrijker zijn dan schrijfprestaties, raad ik u aan een te maken functioneel GIN- of GiST-index als volgt:

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

    Deze index ondersteunt beide zoekopdrachten. Houd er rekening mee dat schrijfbewerkingen wat kosten met zich meebrengen.
    Een snelle benchmark voor een vergelijkbaar geval in dit gerelateerde antwoord .



  1. Selecteer en update rijen met datum 00/00/0000 00:00:00 00 in Oracle

  2. gegevens van sql weergeven door op svg-kaart te klikken

  3. SQL, ontbrekend einde, maar waarom?

  4. Hoe schrijf ik een php-bestand om een ​​afbeelding weer te geven zoals <img src=/img.php?imageID=32 />?