VARCHAR कॉलम में स्टोर संख्याओं का अधिकतम मान निकालना
जब संख्याएं VARCHAR कॉलम में स्टोर होती हैं, तो MAX() स्ट्रिंग तुलना करता है (उदाहरण: '9' > '1000')। CAST(... AS UNSIGNED) से संख्यात्मक तुलना कराएं।
टेबल और डेटा
CREATE TABLE findMaxValueInVarcharField (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(200)
);
INSERT INTO findMaxValueInVarcharField (Value) VALUES
('200'), ('1000'), ('899474'), ('39474'), ('4958');
गलत: स्ट्रिंग MAX
SELECT MAX(Value) FROM findMaxValueInVarcharField; -- '999999' टाइप स्ट्रिंग में सबसे बड़ा
सही: संख्यात्मक MAX
SELECT MAX(CAST(Value AS UNSIGNED)) AS MaximumValueFromVarcharField FROM findMaxValueInVarcharField;
आउटपुट
+------------------------------+ | MaximumValueFromVarcharField | +------------------------------+ | 899474 | +------------------------------+
संबंधित: MIN, ORDER BY, WHERE
-- न्यूनतम SELECT MIN(CAST(Value AS UNSIGNED)) FROM findMaxValueInVarcharField; -- क्रमबद्ध SELECT * FROM findMaxValueInVarcharField ORDER BY CAST(Value AS UNSIGNED) DESC; -- फ़िल्टर SELECT * FROM findMaxValueInVarcharField WHERE CAST(Value AS UNSIGNED) > 50000;
प्रदर्शन और स्थायी समाधान
CASTइंडेक्स उपयोग रोकता है।- स्थायी समाधान: कॉलम को
BIGINT/INTमें बदलें:ALTER TABLE ... MODIFY Value BIGINT UNSIGNED; - माइग्रेशन बिना: जनरेटेड कॉलम + इंडेक्स (MySQL 5.7+):
ALTER TABLE findMaxValueInVarcharField ADD COLUMN num_val BIGINT UNSIGNED GENERATED ALWAYS AS (CAST(Value AS UNSIGNED)) STORED, ADD INDEX idx_num_val (num_val);
- फिर
MAX(num_val)याORDER BY num_valतेज़ होगा।