sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan finder man næsten lignende poster i sql?

Sådan et søgekriterie vil ikke kunne gøre brug af nogen indekser, men det kan lade sig gøre...

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

På samme måde, hvis dine søgekriterier er i en anden tabel...

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

(Du skal udfylde værdien af ​​N-M dig selv)

EDIT:

En mere langvarig tilgang, der kan gøre nogle brug af indekser...

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

Hvor du har et indeks på hvert felt individuelt, og hvor du forventer et relativt lavt antal kampe for hvert felt, kan udkonkurrere den første mulighed på bekostning af meget gentagen kode.



  1. Hvorfor returnerer st_intersection ikke-polygoner?

  2. Indsæt NULL-værdi i INT-kolonnen

  3. hæve applikationsfejl Trigger i MySQL DBMS

  4. MySQL IKKE I forespørgsel