使用 SQL 进行语义版本排序

Posted

技术标签:

【中文标题】使用 SQL 进行语义版本排序【英文标题】:Semantic version sort with SQL 【发布时间】:2022-01-02 18:33:08 【问题描述】:

如何直接在SQL中根据https://semver.org/中的规则对语义版本进行正确排序?

示例:1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92, 1.0.0-x-y-z

【问题讨论】:

您使用的是哪个 dbms?不同的产品有不同的解决方案。 【参考方案1】:

一种方法是进行以下查询:

SELECT * FROM table_of_versions ORDER BY
    INET_ATON(
        SUBSTRING_INDEX(
            CONCAT(
                SUBSTRING_INDEX(
                    SUBSTRING_INDEX(version, '+', 1), '-', 1),'.0.0.0')
                    ,'.',4)
            ),
    IF(
        LENGTH(version) = LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(version, '+', 1), '-', 2), '-', -1)),
            "~", SUBSTRING_INDEX(
                    SUBSTRING_INDEX(
                        SUBSTRING_INDEX(version, '+', 1), '-', 2), '-', -1)
    ) DESC,
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(version, '+', 2), '+', -1);

但它不适用于构建部分。

在 SQL 中正确排序语义版本的更高级解决方案,因此条件 1.0.0-alpha < 1.0.0 & 1.0.0-1 < 1.0.0 完美运行,需要向您的数据库添加额外的列。

如果您需要此类解决方案,请随时在此处了解: https://github.com/kotsky/semver-sort-py-sql

【讨论】:

以上是关于使用 SQL 进行语义版本排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中对语义版本进行排序?

使用 Python 语义对 R 中的嵌套列表进行排序

语义版本控制在啥版本下进行版本化?

HTTP Restful 语义版本控制

使用Laravel的语义版本控制进行包版本控制

使用语义发布获取下一个标签版本