PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak znaleźć prawie podobne rekordy w sql?

Takie kryteria wyszukiwania nie będą mogły korzystać z żadnych indeksów, ale można to zrobić...

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

Podobnie, jeśli kryteria wyszukiwania znajdują się w innej tabeli...

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

(Musisz wypełnić wartość N-M siebie)

EDYTUJ:

Bardziej rozwlekłe podejście, które może sprawić, że trochę użycie indeksów...

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

Tam, gdzie masz indeks dla każdego pola z osobna i oczekujesz stosunkowo małej liczby dopasowań dla każdego pola, to może przewyższa pierwszą opcję kosztem bardzo powtarzalnego kodu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmapować tablicę PostgreSQL za pomocą Hibernate?

  2. Jak deserializować wartość BigDecimal otrzymaną od brokera kafka poprzez mechanizm debezium CDC?

  3. Zautomatyzowane testowanie procesu aktualizacji dla PostgreSQL

  4. Nie można określić nazwy dostawcy dla fabryki dostawców typu „Npgsql.NpgsqlFactory”

  5. Funkcja pętli nie działa zgodnie z oczekiwaniami