sql >> Databáze >  >> RDS >> PostgreSQL

Odpovídající vzory mezi více sloupci

Dosavadní odpovědi na vaši otázku neodpovídají:

Nezáleží na tom, zda použijete LIKE nebo = pokud odpovídáte celému řetězci (a nejsou žádné zástupné znaky v váš řetězec). Aby bylo vyhledávání nejasné, musíte nahradit součástí vzoru, nejen k němu přidat.

Například pro shodu na posledních 7 (místo 8) znaků subcolumn :

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

Používám jednodušší left() (představeno s Postgres 9.1).
Můžete could zjednodušte to na:

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

Ale neudělali byste to, pokud byste použili speciální index, o kterém se zmiňuji níže, protože výrazy ve funkčních indexech se musí přesně shodovat, aby byly použitelné.

Mohlo by vás zajímat rozšíření pg_tgrm .

V PostgreSQL 9.1 spusťte jednou pro každou databázi:

CREATE EXTENSION pg_tgrm;

Dva důvody:

  • Poskytuje operátor podobnosti % . S ním můžete vytvořit inteligentní podobnostní vyhledávání:

    --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);
    
  • Poskytuje podporu indexů pro oba LIKE a %

    Pokud je výkon čtení důležitější než výkon zápisu, doporučuji vám vytvořit funkční GIN nebo GiST index takto:

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

    Tento index podporuje oba dotazy. Uvědomte si, že to s sebou nese určité náklady na operace zápisu.
    Rychlý srovnávací test pro podobný případ v této související odpovědi .



  1. Mohu provést atomický přírůstek v Rails 2.3, aniž bych musel přejít na SQL?

  2. Získejte levou část řetězce v SQL Server (T-SQL)

  3. Levé spojení nebo výběr z více tabulek pomocí čárky (,)

  4. Získejte datum, i když v tabulce neexistuje z příkazu SQL SELECT