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

Jak najít téměř podobné záznamy v SQL?

Taková vyhledávací kritéria nebudou moci využívat žádné indexy, ale lze to udělat...

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

Podobně, pokud jsou vaše kritéria vyhledávání v jiné tabulce...

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

(Musíte vyplnit hodnotu N-M sebe)

UPRAVIT:

Zdlouhavější přístup, který může přinést nějaké použití indexů...

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

Kde máte index pro každé pole jednotlivě a kde očekáváte relativně nízký počet shod pro každé pole, to může překonat první možnost na úkor velmi opakovaného kódu.



  1. Licencování MySQL a GPL

  2. Oznamujeme Barman 1.0, Backup and Recovery Manager for PostgreSQL

  3. Proč se mysqli_query() láme? [mysqli_query():Nelze načíst mysqli]

  4. Jak exportovat databáze pomocí příkazového řádku?