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

Как да намеря почти подобни записи в sql?

Такъв критерий за търсене няма да може да използва никакви индекси, но може да се направи...

SELECT
  *
FROM
  yourTable
WHERE
  N-M <= CASE WHEN yourTable.field1 = searchValue1 THEN 1 ELSE 0 END
       + CASE WHEN yourTable.field2 = searchValue2 THEN 1 ELSE 0 END
       + CASE WHEN yourTable.field3 = searchValue3 THEN 1 ELSE 0 END
       ...
       + CASE WHEN yourTable.fieldN = searchValueN THEN 1 ELSE 0 END

По същия начин, ако критериите ви за търсене са в друга таблица...

SELECT
  *
FROM
  yourTable
INNER JOIN
  search
    ON N-M <= CASE WHEN yourTable.field1 = search.field1 THEN 1 ELSE 0 END
            + CASE WHEN yourTable.field2 = search.field2 THEN 1 ELSE 0 END
            + CASE WHEN yourTable.field3 = search.field3 THEN 1 ELSE 0 END
            ...
            + CASE WHEN yourTable.fieldN = search.fieldN THEN 1 ELSE 0 END

(Трябва да попълните стойността на N-M себе си)

РЕДАКТИРАНЕ:

По-дълъг подход, който може да направи някои използване на индекси...

SELECT
    id,  -- your table would need to have a primary key / identity column
    MAX(field1)   AS field1,
    MAX(field2)   AS field2,
    MAX(field3)   AS field3,
    ...
    MAX(fieldN)   AS fieldN
FROM
(
    SELECT * FROM yourTable WHERE field1 = searchValue1
    UNION ALL
    SELECT * FROM yourTable WHERE field2 = searchValue2
    UNION ALL
    SELECT * FROM yourTable WHERE field3 = searchValue3
    ...
    SELECT * FROM yourTable WHERE fieldN = searchValueN
)
    AS unioned_seeks
GROUP BY
    id
HAVING
    COUNT(*) >= N-M

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заключване на предикат в PostgreSQL 9.2.1 с изолация с възможност за сериализиране

  2. docker SHM_SIZE /dev/shm:преоразмеряване на споделена памет

  3. Как да агрегираме съвпадащи двойки в свързани компоненти в Python

  4. Psycopg2 форматиране на низове с имена на променливи за създаване на тип

  5. Методът org.postgresql.jdbc4.Jdbc4Connection.isValid(int) все още не е внедрен