排序多种类型的数字和字符

排序多种类型的数字和字符

问题描述:

如何对具有不同数字和字符的表进行排序.我表格中的列是

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:

  1. 一组开头的字母(如果不存在,则为空,因此以数字开头的值将排在以字母开头的值之前);
  2. 字符串中的第一个数字(可以带字母);
  3. 字符串中的第二组字母(如果存在);
  4. 用括号括起来的尾随数字(如果有的话);
  5. 不带括号的尾随数字(如果有的话).

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

在dbfiddle上进行演示