MySQL में VARCHAR कॉलम में संग्रहीत संख्यात्मक मानों को सही संख्यात्मक क्रम (1, 2, 10, 100 के बजाय 1, 10, 100, 2) में क्रमबद्ध करने के लिए CAST() या CONVERT() का उपयोग करके ORDER BY क्लॉज में संख्यात्मक प्रकार में परिवर्तित करें।
समस्या: स्ट्रिंग क्रमबद्धता
mysql> SELECT * FROM DemoTable726 ORDER BY Value; +-------+ | Value | +-------+ | 10 | | 100 | | 1000 | | 110 | | 2000 | +-------+ -- स्ट्रिंग क्रम: '1' से शुरू होने वाले पहले आते हैं
समाधान: CAST के साथ ORDER BY
SELECT * FROM DemoTable726 ORDER BY CAST(Value AS DECIMAL(20,2));
व्यावहारिक उदाहरण
1. टेबल बनाएं और डेटा डालें
mysql> CREATE TABLE DemoTable726 (Value VARCHAR(100));
Query OK, 0 rows affected (0.60 sec)
mysql> INSERT INTO DemoTable726 VALUES ('100'), ('10'), ('110'), ('2000'), ('1000');
Query OK, 5 rows affected (0.15 sec)
2. डिफ़ॉल्ट स्ट्रिंग क्रम
mysql> SELECT * FROM DemoTable726 ORDER BY Value; +-------+ | Value | +-------+ | 10 | | 100 | | 1000 | | 110 | | 2000 | +-------+
3. आरोही संख्यात्मक क्रम
mysql> SELECT * FROM DemoTable726 ORDER BY CAST(Value AS DECIMAL(20,2)); +-------+ | Value | +-------+ | 10 | | 100 | | 110 | | 1000 | | 2000 | +-------+ 5 rows in set (0.00 sec)
4. अवरोही संख्यात्मक क्रम
mysql> SELECT * FROM DemoTable726 ORDER BY CAST(Value AS DECIMAL(20,2)) DESC; +-------+ | Value | +-------+ | 2000 | | 1000 | | 110 | | 100 | | 10 | +-------+ 5 rows in set (0.00 sec)
CAST लक्ष्य प्रकार विकल्प
| प्रकार | उपयोग मामला | उदाहरण |
|---|---|---|
DECIMAL(20,2) | सामान्य दशमलव संख्याएँ | मूल्य, कीमत, माप |
UNSIGNED | गैर-ऋणात्मक पूर्णांक | आईडी, गिनती, वर्ष |
SIGNED | ऋणात्मक सहित पूर्णांक | तापमान, अंतर |
DOUBLE | फ्लोटिंग-पॉइंट | वैज्ञानिक मान |
CONVERT() विकल्प
-- समान परिणाम ORDER BY CONVERT(Value, DECIMAL(20,2)) ORDER BY CONVERT(Value, UNSIGNED)
गैर-संख्यात्मक मान संभालना
-- गैर-संख्यात्मक को अंत में रखें (0 या बड़ी संख्या देकर)
ORDER BY CASE
WHEN Value REGEXP '^[0-9]+(\.[0-9]+)?$' THEN CAST(Value AS DECIMAL(20,2))
ELSE 99999999999
END;
प्रदर्शन: जनरेटेड कॉलम + इंडेक्स (MySQL 5.7+)
ALTER TABLE DemoTable726 ADD ValueNum DECIMAL(20,2) AS (CAST(Value AS DECIMAL(20,2))) STORED, ADD INDEX idx_value_num (ValueNum); -- फिर सरल क्वेरी SELECT * FROM DemoTable726 ORDER BY ValueNum;
सर्वोत्तम अभ्यास
- संभव हो तो संख्यात्मक डेटा के लिए सही संख्यात्मक प्रकार (INT, DECIMAL) उपयोग करें
- मौजूदा VARCHAR कॉलम के लिए CAST समाधान लागू करें
- बड़े टेबल्स पर जनरेटेड कॉलम + इंडेक्स पर विचार करें