我有一些由十进制数字和字母组成的值:
2mm
3x4mm
2.5x5mm
1.7x6mm
1.7x9mm
1.6x5mm
3mm
5mm
3.5x5mm
3.5x8mm
10x7mm
注意:x - 表示字母x
。我想对它们进行升序排序,以便结果如下:
1.6x5mm
1.7x6mm
1.7x9mm
2mm
2.5x5mm
3mm
3x4mm
3.5x5mm
3.5x8mm
5mm
10x7mm
所以我需要小数和字母数字排序。
答案 0 :(得分:2)
您需要使用MySQL string functions。例如,您可以使用LOCATE
和SUBSTRING_INDEX
函数分隔两个数字:
/*
CREATE TABLE test (value VARCHAR(100) DEFAULT NULL);
INSERT INTO test (value) VALUES
('2mm'),
('3x4mm'),
('2.5x5mm'),
('1.7x6mm'),
('1.7x9mm'),
('1.6x5mm'),
('3mm'),
('5mm'),
('3.5x5mm'),
('3.5x8mm'),
('10x7mm');
*/
SELECT
value,
1 * CASE WHEN LOCATE('x', value) > 0 THEN SUBSTRING_INDEX(value, 'x', 1) ELSE SUBSTRING_INDEX(value, 'mm', 1) END AS x,
1 * CASE WHEN LOCATE('x', value) > 0 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(value, 'x', -1), 'mm', 1) ELSE NULL END AS y
FROM test
ORDER BY x, y
为了说明,我将计算放在select子句中而不是order by子句中。结果:
+---------+------+------+
| value | x | y |
+---------+------+------+
| 1.6x5mm | 1.6 | 5 |
| 1.7x6mm | 1.7 | 6 |
| 1.7x9mm | 1.7 | 9 |
| 2mm | 2 | NULL |
| 2.5x5mm | 2.5 | 5 |
| 3mm | 3 | NULL |
| 3x4mm | 3 | 4 |
| 3.5x5mm | 3.5 | 5 |
| 3.5x8mm | 3.5 | 8 |
| 5mm | 5 | NULL |
| 10x7mm | 10 | 7 |
+---------+------+------+
答案 1 :(得分:0)
我会使用以下两种方法去除x之前的所有内容(并替换毫米无效)
SELECT SUBSTRING_INDEX(REPLACE(&#39; 3x4mm&#39;,&#39; mm&#39;,&#39;&#39;),&#39; x&#39;, - 1); < / p>
REPLACE功能是清除单位(mm),并获得第一组(x之前的所有内容)我使用SUBSTRING_INDEX方法获取所有内容直到&#39; x&#39;然后你可以用这个结果排序。
参考: https://dev.mysql.com/doc/refman/5.0/en/string-functions.html