排序多种类型的数字和字符
问题描述:
如何对具有不同数字和字符的表进行排序.我表格中的列是
How to sort a table with different numbers and characters. Column in my table is
res_no
------
B14
A6
C16
105 FF
114A
113
37
39A
91G
93
93(2)
A143B
A141
D154a
A141(25)
C40FF
D153(1)
E18A
D154
A51A
A50
E18A1
我想像这样
res_no
------
37
39A
91G
93
93(2)
105FF
113
114A
A6
A50
A51A
A141
A141(25)
A143B
B14
C40FF
D153(1)
D154
D154A
E18A
E18A1
我试图 ORDER BY
:
REGEXP ('^[0-9]')
CAST(res_no AS UNSIGNED)
REGEXP_SUBSTR(res_no, '(^[a-zA-Z]+)|([a-zA-Z]$)')
CAST(REGEXP_SUBSTR(res_no, '(^[0-9]+)|([0-9]+$)') AS UNSIGNED
该如何解决?对数字进行排序,字母数字值可以很好地与上述代码配合使用,但是括号内的值以及A50,A51A之类的值不能正确排序.
How to solve this? Sorting numbers, alphanumerical values is working perfect with above code but values inside parentheses and like A50,A51A are not sorting correctly.
答
此查询应为您提供所需的结果.查询对5件事进行排序:
This query should give you the results you want. The query orders on 5 things:
- 一组开头的字母(如果不存在,则为空,因此以数字开头的值将排在以字母开头的值之前);
- 字符串中的第一个数字(可以带字母);
- 字符串中的第二组字母(如果存在);
- 用括号括起来的尾随数字(如果有的话);
- 不带括号的尾随数字(如果有的话).
SELECT res_no
FROM table1
ORDER BY REGEXP_SUBSTR(res_no, '^[a-zA-Z]+'),
CAST(REGEXP_REPLACE(res_no, '^[a-zA-Z]*([0-9]+)', '\\1') AS UNSIGNED),
REGEXP_SUBSTR(res_no, '(?<=[0-9])[a-zA-Z]+'),
CAST(REGEXP_SUBSTR(res_no, '(?<=\\()[0-9]+(?=\\))') AS UNSIGNED),
CAST(REGEXP_SUBSTR(res_no, '[0-9]+$') AS UNSIGNED)
输出:
res_no
37
39A
91G
93
93(2)
105FF
113
114A
A6
A50
A51A
A141
A141(25)
A143B
B14
C16
C40FF
D153(1)
D154
D154a
E18A
E18A1