MySQL排序值包含由" x"分隔的两个数字。

时间:2015-05-11 12:24:44

标签: mysql sql sorting

我有一些由十进制数字和字母组成的值:

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

所以我需要小数和字母数字排序。

2 个答案:

答案 0 :(得分:2)

您需要使用MySQL string functions。例如,您可以使用LOCATESUBSTRING_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