PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Übereinstimmungsmuster zwischen mehreren Spalten

Die bisherigen Antworten gehen nicht auf Ihre Frage ein:

Dabei spielt es kaum eine Rolle, ob Sie LIKE verwenden oder = solange Sie mit der gesamten Zeichenfolge übereinstimmen (und es kein Platzhalterzeichen in gibt deine Saite). Um die Suche unscharf zu machen, müssen Sie ersetzen Teil des Musters, nicht nur hinzufügen.

Zum Beispiel, um die letzten 7 (statt 8) Zeichen von subcolumn abzugleichen :

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

Ich verwende das einfachere left() (eingeführt mit Postgres 9.1).
Sie could Vereinfachen Sie dies zu:

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

Aber Sie würden es nicht tun, wenn Sie den speziellen Index verwenden, den ich weiter unten erwähne, da Ausdrücke in funktionalen Indizes genau übereinstimmen müssen, um von Nutzen zu sein.

Sie könnten an der Erweiterung pg_tgrm interessiert sein .

In PostgreSQL 9.1 einmal pro Datenbank ausführen:

CREATE EXTENSION pg_tgrm;

Zwei Gründe:

  • Es liefert den Ähnlichkeitsoperator % . Damit können Sie eine intelligente Ähnlichkeitssuche aufbauen:

    --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);
    
  • Es bietet Indexunterstützung für beide LIKE und %

    Wenn die Leseleistung wichtiger ist als die Schreibleistung, schlage ich vor, dass Sie einen erstellen funktionsfähig GIN- oder GiST-Index wie folgt:

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

    Dieser Index unterstützt beide Abfragen. Beachten Sie, dass Schreibvorgänge mit einigen Kosten verbunden sind.
    Ein schneller Benchmark für einen ähnlichen Fall in dieser verwandten Antwort .