sql >> Databasteknik >  >> RDS >> PostgreSQL

Matchande mönster mellan flera kolumner

Svaren hittills saknar svar på din fråga:

Det gör knappast någon skillnad om du använder LIKE eller = så länge du matchar hela strängen (och det inte finns några jokertecken i). din sträng). För att göra sökningen otydlig måste du byta ut en del av mönstret, inte bara lägga till det.

Till exempel att matcha de sista 7 (istället för 8) tecknen i subcolumn :

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

Jag använder den enklare left() (introducerat med Postgres 9.1).
Du could förenkla detta till:

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

Men du skulle inte göra det om du använder det speciella index som jag nämner längre ner, eftersom uttryck i funktionella index måste matchas exakt för att vara till nytta.

Du kanske är intresserad av tillägget pg_tgrm .

I PostgreSQL 9.1 körs en gång per databas:

CREATE EXTENSION pg_tgrm;

Två skäl:

  • Den tillhandahåller likhetsoperatorn % . Med den kan du bygga en smart likhetssökning:

    --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);
    
  • Den tillhandahåller indexstöd för båda LIKE och %

    Om läsprestanda är viktigare än skrivprestanda, föreslår jag att du skapar en funktionell GIN eller GiST-index så här:

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

    Detta index stöder båda frågorna. Tänk på att det medför en viss kostnad för skrivoperationer.
    Ett snabbt riktmärke för ett liknande fall i detta relaterade svar .



  1. Ett JNI-fel har uppstått, kontrollera din installation och försök igen i Eclipse x86 Windows 8.1

  2. sql server trigger hjälp - samma tabell uppdatering

  3. kan inte infoga rysk text i mysql-databasen

  4. C# MySQL Connector