如何解决SUBSTRING_INDEX用符号和字符对数字进行排序
我使用MysqL 5.5进行查询。我遇到的问题是在字符前面用-
对数字进行排序。下面是我的示例表,我想对列number_with_name
进行排序,条件如下:
表名称:test123
+-----+--------------------+
| id | number_with_name |
+-----+--------------------+
| 1 | 200-2 David |
| 2 | 200-2-2 Peter |
| 3 | 200-2-2-9 James |
| 4 | 200 Robert |
| 5 | 200-2-3 Siva |
| 6 | 200-2-5 Denny |
| 8 | 200-2-9 Rose |
| 9 | 200-3 Kiki |
| 10 | 100-3-2 Viva |
| 11 | 100-3-15 Proton |
| 12 | 100-3-6 Saga |
| 13 | 100 Liver |
| 14 | 100-3 Shawn |
| 15 | 100-3-5-1 Kola |
| 16 | 100-3-5-8 Frankie|
| 17 | 100-3-5 Jala |
+----+---------------------+
我希望得到如下表所示的预期结果:
+-----+--------------------+
| id | number_with_name |
+-----+--------------------+
| 13 | 100 Liver |
| 14 | 100-3 Shawn |
| 10 | 100-3-2 Viva |
| 17 | 100-3-5 Jala |
| 15 | 100-3-5-1 Kola |
| 16 | 100-3-5-8 Frankie|
| 12 | 100-3-6 Saga |
| 11 | 100-3-15 Proton |
| 4 | 200 Robert |
| 1 | 200-2 David |
| 2 | 200-2-2 Peter |
| 3 | 200-2-2-9 James |
| 5 | 200-2-3 Siva |
| 6 | 200-2-5 Denny |
| 8 | 200-2-9 Rose |
| 9 | 200-3 Kiki |
+----+---------------------+
我已经在sql下面使用过排序,但是它不起作用。
SELECT * from test123 order by SUBSTRING_INDEX(number_with_name,'-',-1) + 0 asc
Akira真实测试的答案结果:
希望有人可以指导我如何分类这种情况。谢谢。
解决方法
SELECT *
FROM test
ORDER BY SUBSTRING_INDEX(number_with_name,'-',1) + 0,CASE WHEN LENGTH(number_with_name) - LENGTH(REPLACE(number_with_name,'')) > 0
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(number_with_name,2),-1) + 0
ELSE 0
END,'')) > 1
THEN SUBSTRING_INDEX(SUBSTRING_INDEX(number_with_name,3),-1) + 0
ELSE 0
END
,
我认为这是一种更通用的方法。想法是将组件视为字符串,而不是数字。您可以先按长度排序,然后按字母顺序对值排序,将数字字符串作为数字排序。
由于前缀在排序字符串时并不重要,因此您可以仅使用substring_index()
:
SELECT *
FROM test
ORDER BY LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(number_with_name,' ',1),1)) ASC,SUBSTRING_INDEX(SUBSTRING_INDEX(number_with_name,LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(number_with_name,2)) ASC,3)) ASC,4)) ASC,4)
这最多可以分类四个部分。唯一的窍门是嵌套的substring_index()
。这将比较仅限于初始数字,这似乎是有意图的。
Here是db 小提琴。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。