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

MySQL में VARCHAR कॉलम को FLOAT के रूप में सॉर्ट करना: CAST ऑपरेटर काम नहीं कर रहा?


समाधान: कॉलम को 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 सबसे सरल वर्कअराउंड है।
  1. - MySQL में एग्रीगेट फंक्शन का उपयोग करके कॉलम मानों का औसत निकालना

    MySQL में एग्रीगेट फंक्शन के साथ कॉलम मानों का औसत निकालना MySQL में AVG() फ़ंक्शन सीधे औसत निकालता है, लेकिन इस उदाहरण में एक कस्टम गणना दिखाई गई है: (SUM * 100) / (100 + 500)। व्यावहारिक उदाहरण तालिका बनाना CREATE TABLE DemoTable ( Number INT ); रिकॉर्ड डालना INSERT INTO DemoTable VALUES(

  1. - MySQL क्वेरी: VARCHAR कॉलम से IP पते को उसी टेबल में INTEGER में कॉपी करना

    INET_ATON() और INET_NTOA() का उपयोग करके IP पते को पूर्णांक में बदलना इसके लिए INET_ATON() का उपयोग करें। पहले टेबल बनाएं: create table DemoTable1404 ( IpAddress varchar(40) ); Query OK, 0 rows affected (1.02 sec) रिकॉर्ड डालें: insert into DemoTable1404 values(224.0.0.0); Query OK, 1 row affected

  1. - MySQL में ! ऑपरेटर का उपयोग

    सिफारिश ! ऑपरेटर का उपयोग न करें। MySQL में NOT कीवर्ड पहले से उपलब्ध है जो समान कार्य करता है और अधिक पठनीय/मानक है। उदाहरण: टेबल बनाना और डेटा डालना ); Query OK, 0 rows affected (0.50 sec) INSERT INTO DemoTable1560 VALUES(0); Query OK, 1 row affected (0.16 sec) सभी रिकॉर्ड देखना SELECT * FRO