How to compare version string (“x.y.z”) in MySQL?

前端 未结 10 2131
南旧
南旧 2020-12-16 14:02

I have firmware version strings into my table (like \"4.2.2\" or \"4.2.16\")

How can I compare, select or sort them ?

I cannot use standard strings compariso

10条回答
  •  萌比男神i
    2020-12-16 15:07

    This is my solution. It not depends on number of subversion.

    For example:

    select SF_OS_VERSION_COMPARE('2016.10.1712.58','2016.9.1712.58');

    returns 'HIGH'

    select SF_OS_VERSION_COMPARE('2016.10.1712.58','2016.10.1712.58');

    returns 'EQUAL'

    delimiter //
    
    DROP FUNCTION IF EXISTS SF_OS_VERSION_COMPARE //
    
    CREATE FUNCTION SF_OS_VERSION_COMPARE(ver_1 VARCHAR(50), ver_2 VARCHAR(50)) RETURNS VARCHAR(5)
        DETERMINISTIC
        COMMENT 'Return "HIGH", "LOW" OR "EQUAL" comparing VER_1 with VER_2'
    BEGIN
        DECLARE v_ver1 VARCHAR(50);
        DECLARE v_ver2 VARCHAR(50);
        DECLARE v_ver1_num INT;
        DECLARE v_ver2_num INT;
    
        SET v_ver1 = ver_1;
        SET v_ver2 = ver_2;
    
        WHILE ( v_ver1 <> v_ver2 AND ( v_ver1 IS NOT NULL OR v_ver2 IS NOT NULL )) DO
    
        SET v_ver1_num = CAST(SUBSTRING_INDEX(v_ver1, '.', 1) AS UNSIGNED INTEGER);
        SET v_ver2_num = CAST(SUBSTRING_INDEX(v_ver2, '.', 1) AS UNSIGNED INTEGER);
    
        IF ( v_ver1_num > v_ver2_num )
        THEN
            return 'HIGH';
        ELSEIF ( v_ver1_num < v_ver2_num )
        THEN
            RETURN 'LOW';
        ELSE
            SET v_ver1 = SUBSTRING(v_ver1,LOCATE('.', v_ver1)+1);
            SET v_ver2 = SUBSTRING(v_ver2,LOCATE('.', v_ver2)+1);
        END IF;
    
        END WHILE;
    
        RETURN 'EQUAL';
    
    END //
    

提交回复
热议问题