答案 0 :(得分:2)
这是一个黑客攻击。但是,它应该适用于您可能遇到的大多数情况......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table (string VARCHAR(12) NOT NULL PRIMARY KEY);
INSERT INTO my_table VALUES
('1'),
('2'),
('3'),
('3.1'),
('3.2'),
('3.2.1'),
('3.21.2'),
('3.3'),
('3.4'),
('4'),
('4.1'),
('4.1.1'),
('4.2');
SELECT *
FROM my_table
ORDER
BY INET_ATON(REPLACE(TRIM(RPAD(string,8,' 0')),' ','.'));
+--------+
| string |
+--------+
| 1 |
| 2 |
| 3 |
| 3.1 |
| 3.2 |
| 3.2.1 |
| 3.3 |
| 3.4 |
| 3.21.2 |
| 4 |
| 4.1 |
| 4.1.1 |
| 4.2 |
+--------+
答案 1 :(得分:1)
这是一种方式:
order by substring_index(main_module, '.', 1) + 0,
substring_index(substring_index(main_module, '.', 2), '.', -1) + 0,
substring_index(substring_index(main_module, '.', 3), '.', -1) + 0
这将从模块中提取每个数字并将其用于排序。
答案 2 :(得分:1)
我尝试了一种方法,其中字符串中.
的可用性。我也使用了Gordon Linoff's逻辑。
SELECT main_module,
(CASE DotLen WHEN 0 THEN main_module
WHEN 1 THEN substring_index(substring_index(main_module, '.', 1), '.', -1)
WHEN 2 THEN substring_index(substring_index(main_module, '.', 1), '.', 1) ELSE 0 END * 1 ) AS D1,
(CASE DotLen WHEN 1 THEN substring_index(substring_index(main_module, '.', 2), '.', -1)
WHEN 2 THEN substring_index(substring_index(main_module, '.', 2), '.', -1) ELSE 0 END * 1 ) AS D2,
(CASE DotLen WHEN 2 THEN substring_index(substring_index(main_module, '.', 3), '.', -1) ELSE 0 END * 1 ) AS D3
FROM (
SELECT *, LENGTH(main_module) - LENGTH(REPLACE(main_module, '.', '')) AS DotLen
FROM `NumericCheck`
) AS R
ORDER BY D1, D2, D3;
您可以通过添加另一个子查询来跳过select中的计算值。
对于样本,我也尝试了两位小数,它工作正常。