MySQL में FIND_IN_SET() फ़ंक्शन: कॉमा-सेपरेटेड मानों के साथ IN जैसा व्यवहार
जब आपके पास कॉमा-सेपरेटेड स्ट्रिंग हो और आप जांचना चाहें कि कोई कॉलम मान उस सूची में है या नहीं, तो FIND_IN_SET() फ़ंक्शन का उपयोग करें। यह IN ऑपरेटर का विकल्प है जो स्ट्रिंग सूची पर काम करता है।
वाक्यविन्यास
FIND_IN_SET(str, strlist)
यदि str strlist में मिलता है तो स्थिति (1-आधारित) लौटाता है, अन्यथा 0।
उदाहरण के साथ पूर्ण कार्यान्वयन
टेबल बनाना
mysql> CREATE TABLE DemoTable604 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Title VARCHAR(100)
);
रिकॉर्ड डालना
mysql> INSERT INTO DemoTable604(Title) VALUES('MySQL'), ('C++'), ('MongoDB'), ('Java');
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable604;
आउटपुट:
+----+---------+
| Id | Title |
+----+---------+
| 1 | MySQL |
| 2 | C++ |
| 3 | MongoDB |
| 4 | Java |
+----+---------+
4 rows in set (0.00 sec)
FIND_IN_SET के साथ क्वेरी
mysql> SELECT * FROM DemoTable604
WHERE FIND_IN_SET(Title, 'C++,MongoDB');
आउटपुट:
+----+---------+
| Id | Title |
+----+---------+
| 2 | C++ |
| 3 | MongoDB |
+----+---------+
2 rows in set (0.00 sec)
कैसे काम करता है:
FIND_IN_SET('C++', 'C++,MongoDB')→ 1 (पहली स्थिति)FIND_IN_SET('MongoDB', 'C++,MongoDB')→ 2 (दूसरी स्थिति)FIND_IN_SET('MySQL', 'C++,MongoDB')→ 0 (नहीं मिला)- WHERE क्लॉज में 0 = FALSE, गैर-शून्य = TRUE
FIND_IN_SET vs IN
| पहलू | IN | FIND_IN_SET |
|---|---|---|
| इनपुट | मान सूची या उपक्वेरी | कॉमा-सेपरेटेड स्ट्रिंग |
| प्रदर्शन | इंडेक्स उपयोग कर सकता है | इंडेक्स उपयोग नहीं कर सकता (फुल स्कैन) |
| डेटा टाइप | कॉलम टाइप से मेल खाना चाहिए | स्ट्रिंग तुलना |
| NULL हैंडलिंग | मानक SQL | NULL इनपुट पर NULL लौटाता है |
सावधानियां
- कोई इंडेक्स उपयोग नहीं: बड़े टेबल पर धीमा हो सकता है
- सटीक मिलान: स्पेस मायने रखते हैं:
'C++, MongoDB'(स्पेस के साथ) 'C++' से मेल नहीं खाएगा - सेपरेटर: केवल कॉमा (,) काम करता है; अन्य सेपरेटर के लिए REPLACE() उपयोग करें
बेहतर विकल्प: JSON_CONTAINS (MySQL 5.7+)
WHERE JSON_CONTAINS('["C++", "MongoDB"]', JSON_QUOTE(Title))
या उपक्वेरी के साथ IN
WHERE Title IN (SELECT TRIM(val) FROM JSON_TABLE('["C++", "MongoDB"]', '$[*]' COLUMNS(val VARCHAR(100) PATH '$')) AS jt)