ऐसे खोज मानदंड किसी भी अनुक्रमणिका का उपयोग नहीं कर पाएंगे, लेकिन ऐसा किया जा सकता है...
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
जहां आपके पास प्रत्येक फ़ील्ड पर व्यक्तिगत रूप से एक अनुक्रमणिका है, और जहां आप प्रत्येक फ़ील्ड के लिए अपेक्षाकृत कम संख्या में मैचों की अपेक्षा करते हैं, यह हो सकता है बहुत दोहराव वाले कोड की कीमत पर, पहले विकल्प से बेहतर प्रदर्शन करें।