2016-11-08 229 views
0

我有一个字符串,如排序数字串字母

70x100 CM 
70x140 CM 
70x70 CM 
72x120 CM 
70x130x70 CM 
70x75x70 CM 
72x72 CM 

当我想在这个顺序排序:

70x70 CM 
70x75x70 CM 
70x100 CM 
70x130x70 CM 
70x140 CM 
72x72 CM 
72x120 CM 

这是我的代码:

ORDER BY CAST(CAST(eaov.value AS DECIMAL(3,0)) as UNSIGNED INTEGER), eaov.value 

任何想法?

+3

将宽度,深度和SI单位存储在单独的列中。 – Strawberry

+1

...整数类型列。 – jarlh

回答

2

未成年MOD由草莓答案。这改变了“厘米”的一系列X0,以确保总有3个维度的排序顺序

SELECT * 
FROM eaov 
ORDER BY CAST(SUBSTRING_INDEX(REPLACE(eaov.value, ' CM', 'x0x0x0'), 'x', 1) as UNSIGNED INTEGER), 
     CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(eaov.value, ' CM', 'x0x0x0'), 'x', 2), 'x', -1) as UNSIGNED INTEGER), 
     CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(eaov.value, ' CM', 'x0x0x0'), 'x', 2), 'x', -1) as UNSIGNED INTEGER) 

性能会不会是其强项。

1

我没有认真提倡这是一个解决方案 - 但作为一项临时措施(和容易适应标准化设计的目的)...

SELECT * FROM my_table 
    ORDER 
    BY substring_index(string,'x',1) + 0 
     , substring_index(substring_index(string,'x',-1),' ',1) + 0 
+0

不以该字符串工作 70X100 CM 70x140厘米 70x70厘米 72x120厘米 70x130x70 CM 70x75x70 CM 最高72x72厘米 – maurizio

+0

@maurizio除了是没用的,像声明 “不工作” 是在完全不能接受所以。 – Strawberry