[adsense id=”0514458240″ width=”468″ height=”60″]
I have been asked once how to get the max version number which is stored in the format: xx.yy.zz. However, the information stored did not include leading zeros. This caused a problem as follows:
mysql> select version from software; +--------+ | version | +--------+ | 2.1.9 | | 2.1.10 | +--------+ 2 rows in set (0.00 sec) mysql> select max(version) from software; +-----------+ | max(version) | +-----------+ | 2.1.9 | +-----------+ 1 row in set (0.00 sec)
In the example above, 2.1.9 has a higher value than the 2.1.10 which clearly is the higher of the two.
This can only be solved using a stored function as follows:
DROP FUNCTION IF EXISTS pversion; delimiter $$ CREATE FUNCTION pversion(p_ver VARCHAR(20)) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE l_start INT; DECLARE l_end INT; DECLARE l_maj VARCHAR(5); DECLARE l_med VARCHAR(5); DECLARE l_min VARCHAR(5); SET l_start = 1; SET l_end = LOCATE('.', p_ver, l_start); IF (l_start + 1) = l_end THEN SET l_maj = CONCAT('0',SUBSTR(p_ver, l_start, 1)); ELSE SET l_maj = SUBSTR(p_ver, l_start, 2); END IF; SET l_start = l_end+1; SET l_end = LOCATE('.', p_ver, l_start); IF (l_start + 1) = l_end THEN SET l_med = CONCAT('0',SUBSTR(p_ver, l_start, 1)); ELSE SET l_med = SUBSTR(p_ver, l_start, 2); END IF; SET l_start = l_end+1; SET l_end = LOCATE('.', p_ver, l_start); IF LENGTH(SUBSTR(p_ver, l_start)) = 1 THEN SET l_min = CONCAT('0',SUBSTR(p_ver, l_start)); ELSE SET l_min = SUBSTR(p_ver, l_start); END IF; RETURN CONCAT(l_maj,'.',l_med,'.',l_min); END; $$ delimiter ;
Now if we attempt to access the information using this function:
mysql> select max(pversion(version)) from software; +---------------------+ | max(pversion(version)) | +---------------------+ | 02.01.10 | +---------------------+ 1 row in set (0.00 sec)