Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में कॉमा-अलग स्ट्रिंग को IN() क्लॉज में उपयोग करने की सीमाएं और विकल्प

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' है। सही दृष्टिकोण चुनें।

  1. - MySQL में STR_TO_DATE का उपयोग करके स्ट्रिंग को समय/दिनांक-समय में परिवर्तित करना

    MySQL में STR_TO_DATE() फ़ंक्शन का उपयोग करके निर्दिष्ट फॉर्मेट वाली स्ट्रिंग को DATETIME मान में परिवर्तित करें। सिंटैक्स SELECT STR_TO_DATE(yourColumnName, %d/%m/%Y %h:%i %p) AS anyAliasName FROM yourTableName; उदाहरण: टेबल बनाना और डेटा डालना mysql> CREATE TABLE DemoTable ( -> DueDa

  1. - MySQL में @ चिह्न (उपयोगकर्ता-परिभाषित चर) का उपयोग करें

    MySQL में @ चिह्न **उपयोगकर्ता-परिभाषित चर (user-defined variables)** को दर्शाता है। ये चर सत्र-विशिष्ट (session-specific) होते हैं और एक कनेक्शन के भीतर मानों को अस्थायी रूप से संग्रहीत करके क्वेरी के बीच साझा करने की अनुमति देते हैं। सिंटैक्स SET @variable_name := value; या SELECT में असाइनमेंट:

  1. - MySQL में SUBSTRING और CAST से न्यूमेरिक स्ट्रिंग पर तुलना ऑपरेटर उपयोग करें

    5-9, 2-4 जैसे हाइफ़न-सेपरेटेड न्यूमेरिक स्ट्रिंग कॉलम पर तुलना करने के लिए SUBSTRING + INSTR से पहला नंबर निकालें और CAST(... AS SIGNED) से पूर्णांक में बदलें। टेबल बनाएं mysql> CREATE TABLE DemoTable1881 ( UserId INT, UserEducationGap VARCHAR(20) ); डेटा डालें mysql> INSERT INTO Dem