1

下面的数据是一个按升序排列的字符串列:

1/44/104/66
1/44/104/66/137
1/44/104/66/138
1/44/104/66/139
1/44/104/66/140
1/44/104/66/141
1/44/104/66/142
1/44/104/66/143
1/44/104/66/67
1/44/104/66/68
1/44/104/66/69

但我想这样排序:

1/44/104/66
1/44/104/66/67
1/44/104/66/68
1/44/104/66/69
1/44/104/66/137
1/44/104/66/138
1/44/104/66/139
1/44/104/66/140
1/44/104/66/141
1/44/104/66/142
1/44/104/66/143
4

4 回答 4

0

不是一个漂亮的查询,但它应该做你需要的:

SELECT s
FROM
  yourtable
ORDER BY
  s + 0,
  CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>0
       THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 2), '/', -1)+0
       ELSE 0 END,
  CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>1
       THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 3), '/', -1)+0
       ELSE 0 END,
  CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>2
       THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 4), '/', -1)+0
       ELSE 0 END,
  CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>3
       THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 5), '/', -1)+0
       ELSE 0 END

在此处查看小提琴。

于 2013-04-16T20:01:00.873 回答
0

对于您拥有的数据,这应该有效:

order by length(col), col

但是,这假设唯一的区别在于最后一列。

于 2013-04-16T18:21:09.480 回答
0

您可以尝试以下方式:

select
    Name
from TableOne
ORDER BY Cast(Replace(Name, "/", "") as UNSIGNED)
于 2013-04-16T18:33:06.197 回答
0
SELECT * FROM myTable 
ORDER BY CAST(SUBSTRING_INDEX(DATA_COLUMN,"/",-1) AS UNSIGNED) ;

这个怎么运作 :

1:在您的原始顺序中,顺序不正确,因为它是按字典顺序比较字符串,而您希望基于整数值进行排序。

2.. 在此解决方案中,SUBSTRING_INDEX提取 之后的最后一个值/,然后将其转换为整数以提供所需的顺序。

3.. 您可以将相同的解决方案扩展到数据模式中的倒数第二个、倒数第三个数字。

于 2013-04-16T18:33:27.547 回答