MySQL में IN() क्लॉज के अंदर कॉमा-अलग स्ट्रिंग ('10,20,50') पास करना **काम नहीं करता** जैसा अपेक्षित होता है। MySQL पूरे स्ट्रिंग को **एकल मान** मानता है, न कि मानों की सूची। यह लेख इस व्यवहार को दर्शाता है और सही विकल्प दिखाता है।
समस्या प्रदर्शन
टेबल बनाएं:
mysql> CREATE TABLE DemoTable1314 (Number VARCHAR(100));
mysql> INSERT INTO DemoTable1314 VALUES('45,67,89');
mysql> INSERT INTO DemoTable1314 VALUES('10,20,50');
mysql> INSERT INTO DemoTable1314 VALUES('90,56,45');
डेटा देखें:
mysql> SELECT * FROM DemoTable1314;
+----------+ | Number | +----------+ | 45,67,89 | | 10,20,50 | | 90,56,45 | +----------+
गलत दृष्टिकोण - कॉमा-अलग स्ट्रिंग को IN() में पास करना
mysql> SELECT * FROM DemoTable1314 WHERE Number IN('10,20,50');
+----------+ | Number | +----------+ | 10,20,50 | +----------+
केवल वही पंक्ति मिली जहां कॉलम मान सटीक स्ट्रिंग '10,20,50' है। यह 10, 20, या 50 को अलग-अलग मानों के रूप में **नहीं** मानता।
सही विकल्प
विकल्प 1: FIND_IN_SET() - कॉमा-अलग कॉलम मान के लिए
यदि कॉलम में कॉमा-अलग मान संग्रहीत हैं:
SELECT * FROM DemoTable1314
WHERE FIND_IN_SET('10', Number) > 0
OR FIND_IN_SET('20', Number) > 0
OR FIND_IN_SET('50', Number) > 0;
विकल्प 2: JSON_TABLE (MySQL 8.0+) - स्ट्रिंग को पंक्तियों में बदलें
SELECT * FROM DemoTable1314
WHERE Number IN (
SELECT TRIM(val) FROM JSON_TABLE(
CONCAT('["', REPLACE('10,20,50', ',', '","'), '"]'),
"$[*]" COLUMNS (val VARCHAR(100) PATH "$")
) AS jt
);
विकल्प 3: प्रीपेयर्ड स्टेटमेंट (एप्लिकेशन कोड में)
एप्लिकेशन लेयर में स्ट्रिंग को पार्स करके अलग-अलग मानों के साथ IN(?, ?, ?) बनाएं।
विकल्प 4: अस्थायी टेबल या CTE
WITH vals AS (SELECT TRIM(val) AS v FROM JSON_TABLE(...)) SELECT * FROM DemoTable1314 WHERE Number IN (SELECT v FROM vals);
सर्वोत्तम अभ्यास: नॉर्मलाइज्ड डिज़ाइन
कॉमा-अलग मान संग्रहीत करने के बजाय, **जंक्शन टेबल** या **अलग पंक्तियों** का उपयोग करें:
CREATE TABLE items (id INT PRIMARY KEY, name VARCHAR(50)); CREATE TABLE item_tags (item_id INT, tag VARCHAR(50), FOREIGN KEY (item_id) REFERENCES items(id));
सारांश
| स्थिति | समाधान |
|---|---|
| कॉलम में CSV डेटा, खोज मान सूची | FIND_IN_SET() या JSON_TABLE |
| खोज मान CSV स्ट्रिंग, कॉलम एकल मान | एप्लिकेशन में पार्स करें, IN(?,?) उपयोग करें |
| नया डिज़ाइन | अलग टेबल/पंक्तियों में नॉर्मलाइज़ करें |
निष्कर्ष: MySQL में IN('a,b,c') तीन मान नहीं, एक मान 'a,b,c' है। सही दृष्टिकोण चुनें।