MySQL中varchar类型字段存储混合值如何实现数值排序
varchar字段按数值规则排序解决方案
核心逻辑
varchar类型字段直接排序默认走字典序,会出现10 < 2的不符合预期的结果,核心解决思路是先筛选出可转为数值的内容,转成数值类型后排序,非数值类内容可自定义排序优先级。
各数据库实现代码
MySQL
SELECT * FROM 你的表名 ORDER BY -- 可转数值的内容排在前,非数值内容排在后 IF(parameter_value REGEXP '^[+-]?\\d+(\\.\\d+)?$', 0, 1), -- 数值内容按实际数值大小升序 parameter_value + 0 ASC;
PostgreSQL
SELECT * FROM 你的表名 ORDER BY CASE WHEN parameter_value ~ '^[+-]?\d+(\.\d+)?$' THEN 0 ELSE 1 END, CASE WHEN parameter_value ~ '^[+-]?\d+(\.\d+)?$' THEN parameter_value::numeric ELSE NULL END ASC;
Oracle
SELECT * FROM 你的表名 ORDER BY CASE WHEN REGEXP_LIKE(parameter_value, '^[+-]?\d+(\.\d+)?$') THEN 0 ELSE 1 END, CASE WHEN REGEXP_LIKE(parameter_value, '^[+-]?\d+(\.\d+)?$') THEN TO_NUMBER(parameter_value) ELSE NULL END ASC;
排序效果
执行后可得到你预期的排序结果:
0.001
0.002
3
3.1
4
4.3
4.9
内容的提问来源于stack exchange,提问作者Nitesh Dhiman
相关产品推荐
相关产品推荐

