MySQL में VARCHAR कॉलम जिसमें संख्यात्मक और गैर-संख्यात्मक मान दोनों हों, को संख्यात्मक क्रम में क्रमबद्ध करने के लिए CAST() और IF() फ़ंक्शन्स का संयोजन उपयोग करें।
समस्या
डिफ़ॉल्ट स्ट्रिंग क्रमबद्धता में '100', '190' से पहले आता है, लेकिन 'John' संख्याओं के साथ मिश्रित हो जाता है।
समाधान: CAST के साथ ORDER BY IF
SELECT * FROM DemoTable ORDER BY IF(CAST(EmployeeCode AS SIGNED) = 0, 99999999999, CAST(EmployeeCode AS SIGNED));
व्यावहारिक उदाहरण
1. टेबल बनाएं और डेटा डालें
mysql> CREATE TABLE DemoTable (EmployeeCode VARCHAR(100));
Query OK, 0 rows affected (1.17 sec)
mysql> INSERT INTO DemoTable VALUES ('190'), ('100'), ('John'), ('120');
Query OK, 4 rows affected (0.20 sec)
2. डिफ़ॉल्ट क्रमबद्धता (स्ट्रिंग क्रम)
mysql> SELECT * FROM DemoTable ORDER BY EmployeeCode; +--------------+ | EmployeeCode | +--------------+ | 100 | | 120 | | 190 | | John | +--------------+ 4 rows in set (0.00 sec)
3. संख्यात्मक क्रमबद्धता (संख्याएं पहले, फिर स्ट्रिंग्स)
mysql> SELECT * FROM DemoTable ORDER BY IF(CAST(EmployeeCode AS SIGNED) = 0, 99999999999, CAST(EmployeeCode AS SIGNED)); +--------------+ | EmployeeCode | +--------------+ | 100 | | 120 | | 190 | | John | +--------------+ 4 rows in set, 1 warning (0.00 sec)
व्याख्या
CAST(EmployeeCode AS SIGNED)- स्ट्रिंग को संख्या में बदलता है- गैर-संख्यात्मक स्ट्रिंग्स के लिए CAST 0 लौटाता है
IF(CAST(...) = 0, बड़ी_संख्या, CAST(...))- गैर-संख्याओं को अंत में भेजता है- चेतावनी: गैर-संख्यात्मक स्ट्रिंग्स के लिए CAST चेतावनी देता है (हानिरहित)
बेहतर विकल्प: REGEXP (MySQL 8.0+)
SELECT * FROM DemoTable
ORDER BY
CASE
WHEN EmployeeCode REGEXP '^[0-9]+$' THEN CAST(EmployeeCode AS UNSIGNED)
ELSE 99999999999
END;
वर्णमाला क्रम में स्ट्रिंग्स, संख्यात्मक क्रम में संख्याएं
SELECT * FROM DemoTable
ORDER BY
(EmployeeCode REGEXP '^[0-9]+$') DESC, -- संख्याएं पहले (1), फिर स्ट्रिंग्स (0)
CAST(EmployeeCode AS UNSIGNED), -- संख्याओं के लिए संख्यात्मक क्रम
EmployeeCode; -- स्ट्रिंग्स के लिए वर्णमाला क्रम