首页 > 解决方案 > 按升序对 varchar 列进行数字排序

问题描述

我正在尝试按升序排列 ORACLE SQL TABLE 的列(类型 varchar,name=PRODUCTVERSION)中的数据。我努力了:

SELECT * FROM KCProductVersion where productid =1 ORDER BY PRODUCTVERSION asc

在此处输入图像描述

标签: sqlregexoracle

解决方案


您可以将版本号拆分为单独的数字并按以下顺序排序:

order by
    to_number(regexp_substr(productversion, '\d+', 1, 1)),
    to_number(regexp_substr(productversion, '\d+', 1, 2)),
    to_number(regexp_substr(productversion, '\d+', 1, 3))

如果您的版本号可以包含 3 个以上的部分,则可以使用更多表达式扩展该order by子句。to_number()

DB Fiddle 上的演示

with t as (
    select '1.0' productversion from dual
    union all select '1.10' from dual
    union all select '10.5.2' from dual
    union all select '16' from dual
    union all select '2.0.0' from dual
)
select * 
from t
order by
    to_number(regexp_substr(productversion, '\d+', 1, 1)),
    to_number(regexp_substr(productversion, '\d+', 1, 2)),
    to_number(regexp_substr(productversion, '\d+', 1, 3))
| 产品版本 |
| :------------- |
| 1.0 |
| 1.10 |
| 2.0.0 |
| 10.5.2 |
| 16 |

推荐阅读