mysql - 扭曲按字母数字排序
问题描述
我想在数据库中按字母数字对字段进行排序。事实证明这比我想象的要棘手。这只是示例值,内容可能会有所不同,但我希望它足以理解。
我想对这个列表进行排序:
11
01
1
1A
01B
20a
01a
20
1b
2b
02a
像这样:
1
01
1A
01a
1b
01B
02a
2b
11
20
20a
请注意,带前导零和不带前导零的等效数字的相对顺序并不重要,它可以是1 01
或01 1
。
我试过CAST(field AS UNSIGNED)
了,但它不起作用。想法?
解决方案
如果您使用的是 MySQL 8.0 或更高版本,则可以使用REGEXP_SUBSTR(colname, '[a-z]+$')
获取字母后缀,并CAST(colname AS UNSIGNED)
获取数字前缀。然后你可以按这些排序。
SELECT code
FROM yourTable
ORDER BY CAST(code AS UNSIGNED), REGEXP_SUBSTR(code, '[a-z]+$')
请参阅mysql 中 REGEXP_SUBSTR 的等价物是什么?了解如何在早期版本的 MySQL 中获得类似的功能。
另一种可能是:
ORDER BY CAST(code AS UNSIGNED), TRIM(LEADING '0' FROM code)
推荐阅读
- qt - 带有.svg的QPixmap“无法从中创建图像”?
- react-native - 在 React Native 应用程序中使用排版命名空间的最佳方法是什么
- angular - 使用 --aot 标志运行时,无法在 Angular 模块中加载动态参数 forRoot 导入
- java - 我可以在 @Query 注释中传递属性值吗?
- c# - Raspberry Pi 与 Win10 IoT 和 Xamarin Android 应用程序之间的 TCP 通信
- angular - 将 Angular 2 网站部署到 EcoWebhosting
- reactjs - ref 按钮的 clientWidth 属性返回 undefined
- c++ - 在 OpenCV FOURCC 编解码器中编写视频
- ios - 在 swift 中为选项创建 JSON
- c++ - 矩阵乘法性能,int vs double