PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Съвпадение на шаблони между множество колони

Отговорите досега не отговарят на вашия въпрос:

Няма никаква разлика дали използвате LIKE или = стига да съответствате на целия низ (и няма заместващ знак in вашият низ). За да направите търсенето размито, трябва да замените част от шаблона, а не просто добавяне към него.

Например, за съпоставяне на последните 7 (вместо 8) знака на subcolumn :

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

Използвам по-простия left() (въведено с Postgres 9.1).
Вие could опростете това до:

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

Но не бихте го направили, ако използвате специалния индекс, който споменах по-долу, защото изразите във функционалните индекси трябва да съвпадат точно, за да бъдат полезни.

Може да се интересувате от разширението pg_tgrm .

В PostgreSQL 9.1 стартирайте веднъж за база данни:

CREATE EXTENSION pg_tgrm;

Две причини:

  • Той предоставя оператора за подобие % . С него можете да създадете интелигентно търсене по сходство:

    --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);
    
  • Той предоставя поддръжка на индекс и за двете LIKE и %

    Ако производителността при четене е по-важна от производителността при запис, предлагам ви да създадете функционален GIN или GiST индекс като този:

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

    Този индекс поддържа и двете заявки. Имайте предвид, че идва с известни разходи за операции по запис.
    Бърз бенчмарк за подобен случай в този свързан отговор .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Топ GUI инструменти за PostgreSQL

  2. Хибернация запазване на потребителския модел в Postgres

  3. Как да оптимизираме логическата репликация на PostgreSQL

  4. Как да запазите данните да не се сортират?

  5. SQLAlchemy, изолиране на сериализируеми транзакции и повторни опити по идиоматичен начин на Python