समाधान: कॉलम को 1 से गुणा करें या CAST का सही उपयोग करें
यदि CAST() अपेक्षित रूप से काम नहीं कर रहा है, तो कॉलम को 1 से गुणा करें (column * 1) जो MySQL को संख्यात्मक संदर्भ में बदलने के लिए मजबूर करता है।
विधि 1: * 1 ट्रिक (सरल और तेज़)
SELECT yourColumnName1, yourColumnName2, ... FROM yourTableName ORDER BY yourColumnName * 1 DESC;
विधि 2: CAST के साथ DECIMAL (स्पष्ट सटीकता)
SELECT yourColumnName1, yourColumnName2, ... FROM yourTableName ORDER BY CAST(yourColumnName AS DECIMAL(8,2)) DESC;
व्यावहारिक उदाहरण
टेबल बनाना (VARCHAR में संख्यात्मक डेटा)
mysql> CREATE TABLE VarcharColumnAsFloatDemo (
Id INT NOT NULL AUTO_INCREMENT,
Amount VARCHAR(20),
PRIMARY KEY(Id)
);
डेटा डालना
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('3446.23');
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('2464.46');
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('6465.78');
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('6464.98');
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('645.90');
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('6465.99');
mysql> INSERT INTO VarcharColumnAsFloatDemo(Amount) VALUES('3745.76');
मूल डेटा (स्ट्रिंग क्रम में)
+----+---------+ | Id | Amount | +----+---------+ | 1 | 3446.23 | | 2 | 2464.46 | | 3 | 6465.78 | | 4 | 6464.98 | | 5 | 645.90 | | 6 | 6465.99 | | 7 | 3745.76 | +----+---------+
क्वेरी 1: CAST के साथ ORDER BY
mysql> SELECT Id, Amount FROM VarcharColumnAsFloatDemo ORDER BY CAST(Amount AS DECIMAL(8,2)) DESC;
क्वेरी 2: * 1 के साथ ORDER BY
mysql> SELECT Id, Amount FROM VarcharColumnAsFloatDemo ORDER BY Amount * 1 DESC;
दोनों का समान आउटपुट (संख्यात्मक अवरोही क्रम)
+----+---------+ | Id | Amount | +----+---------+ | 6 | 6465.99 | | 3 | 6465.78 | | 4 | 6464.98 | | 7 | 3745.76 | | 1 | 3446.23 | | 2 | 2464.46 | | 5 | 645.90 | +----+---------+
क्यों CAST विफल हो सकता है?
- गलत सटीकता/स्केल:
DECIMAL(8,2)केवल 6 पूर्णांक अंक और 2 दशमलव अनुमति देता है। बड़े मानों के लिएDECIMAL(20,10)आदि उपयोग करें। - गैर-संख्यात्मक वर्ण:
CASTगैर-संख्यात्मक स्ट्रिंग के लिए0लौटाता है (चेतावनी के साथ)। * 1अधिक सहनशील है और अक्सर तेज़ होता है।
सर्वोत्तम अभ्यास
- संख्यात्मक डेटा के लिए हमेशा संख्यात्मक डेटा प्रकार (
DECIMAL,INT,DOUBLE) उपयोग करें। - यदि VARCHAR में संग्रहीत करना पड़े, तो सफाई/सत्यापन एप्लिकेशन लेयर पर करें।
ORDER BY col + 0याORDER BY col * 1सबसे सरल वर्कअराउंड है।