परिचय
जब कॉलम मानों में हाइफ़न (-) से अलग सफ़िक्स हों (जैसे 'John-D', 'John-Smith'), और आप उन सफ़िक्स के आधार पर क्रमबद्ध करना चाहते हैं, तो MySQL के स्ट्रिंग फंक्शन्स और CASE स्टेटमेंट का उपयोग किया जा सकता है।
उदाहरण: टेबल बनाना और डेटा डालना
mysql> CREATE TABLE DemoTable (
-> ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO DemoTable(ClientName) VALUES('Mike');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable(ClientName) VALUES('John');
Query OK, 1 row affected (0.22 sec)
mysql> INSERT INTO DemoTable(ClientName) VALUES('John-D');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable(ClientName) VALUES('John-Smith');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable(ClientName) VALUES('Mike-Smith');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable(ClientName) VALUES('Mike-D');
Query OK, 1 row affected (0.15 sec)
सभी रिकॉर्ड देखना
mysql> SELECT * FROM DemoTable;
आउटपुट:
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 1 | Mike |
| 2 | John |
| 3 | John-D |
| 4 | John-Smith |
| 5 | Mike-Smith |
| 6 | Mike-D |
+----------+------------+
6 rows in set (0.00 sec)
अंतिम स्ट्रिंग वर्ण के आधार पर क्रमबद्ध करने की क्वेरी
mysql> SELECT
-> CASE
-> WHEN RIGHT(ClientName, LENGTH(ClientName) - INSTR(ClientName, '-')) = ClientName THEN ''
-> ELSE RIGHT(ClientName, LENGTH(ClientName) - INSTR(ClientName, '-'))
-> END AS `last`,
-> `ClientName`
-> FROM DemoTable
-> ORDER BY `last`, `ClientName`;
परिणाम
+-------+------------+
| last | ClientName |
+-------+------------+
| | John |
| | Mike |
| D | John-D |
| D | Mike-D |
| Smith | John-Smith |
| Smith | Mike-Smith |
+-------+------------+
6 rows in set (0.00 sec)
व्याख्या
INSTR(ClientName, '-')- हाइफ़न की स्थिति खोजता हैLENGTH(ClientName) - INSTR(...)- हाइफ़न के बाद के अक्षरों की संख्याRIGHT(ClientName, ...)- हाइफ़न के बाद का भाग (सफ़िक्स) निकालता हैCASE ... WHEN ... = ClientName THEN ''- यदि हाइफ़न नहीं है तो खाली स्ट्रिंगORDER BY `last`, `ClientName`- पहले सफ़िक्स से, फिर पूरे नाम से क्रमबद्ध
सरल विकल्प
यदि सभी मानों में हाइफ़न है या आप NULL सॉर्ट करना चाहते हैं:
SELECT ClientName,
SUBSTRING_INDEX(ClientName, '-', -1) AS suffix
FROM DemoTable
ORDER BY suffix, ClientName;
SUBSTRING_INDEX(str, delim, -1) अंतिम डिलीमीटर के बाद का भाग लौटाता है, जो अधिक सरल और पठनीय है।