VARCHAR कॉलम में संग्रहीत संख्याओं की संख्यात्मक तुलना
जब संख्याएं VARCHAR में स्टोर होती हैं, तो स्ट्रिंग तुलना ('9' > '100') गलत परिणाम देती है। CAST(value AS SIGNED) या CAST(value AS UNSIGNED) से संख्यात्मक तुलना करें।
टेबल और डेटा
CREATE TABLE compareTwoStringsDemo (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(100)
);
INSERT INTO compareTwoStringsDemo (Value) VALUES
('1235667'), ('999999'), ('999888'), ('567433'), ('2345123');
स्ट्रिंग तुलना (गलत)
SELECT * FROM compareTwoStringsDemo WHERE Value = '999999';
यह काम करता है क्योंकि सटीक मिलान है, लेकिन WHERE Value > '100000' गलत देगा (स्ट्रिंग तुलना में '9' > '1')।
संख्यात्मक तुलना (सही)
SELECT * FROM compareTwoStringsDemo WHERE CAST(Value AS SIGNED) = 999999;
आउटपुट
+----+--------+ | Id | Value | +----+--------+ | 2 | 999999 | +----+--------+
रेंज क्वेरी उदाहरण
SELECT * FROM compareTwoStringsDemo WHERE CAST(Value AS SIGNED) BETWEEN 500000 AND 1000000;
प्रदर्शन विचार
CASTकॉलम पर इंडेक्स उपयोग को रोकता है (सार्गेबल नहीं)।- बड़े टेबल पर:
Valueकॉलम कोBIGINTयाINTमें बदलें, या जनरेटेड कॉलमnum_val BIGINT GENERATED ALWAYS AS (CAST(Value AS SIGNED)) STOREDबनाकर उस पर इंडेक्स करें। SIGNED= साइन्ड इंटीजर,UNSIGNED= अनसाइन्ड (केवल धनात्मक)।
MySQL 8.0+ शॉर्टकास्ट
WHERE Value + 0 = 999999 -- अंतर्निहित कास्ट