sql server 按字母顺序排序,然后是数字

Posted

技术标签:

【中文标题】sql server 按字母顺序排序,然后是数字【英文标题】:sql server order by alpha then numeric 【发布时间】:2021-09-03 02:48:43 【问题描述】:

我对排序顺序有疑问,结果是在字母表之前列出了 0 和 00 REVISION 值。我希望首先对字母进行排序,然后再对数字进行排序。这意味着 0 和 00 应该在字母之后。除了 0, 00 以外的所有其他排序都是正确的。

我使用以下 sql 查询:

SELECT D.PRIO, D.REVISION, ROW_NUMBER()  OVER(ORDER BY  PRIO, REVISION ) RN FROM (
SELECT  DISTINCT CONVERT(INT, LEFT(REVISION, PATINDEX('%[^0-9]%', REVISION+'z')-1)) 'PRIO',REVISION  FROM DOCUMENTS )D
ORDER BY D.PRIO,D.REVISION ; 

上述查询的结果在字母前显示 0 和 00。

PRIO REVISION RN
0 0 1
0 00 2
0 A 3
0 a 4
0 B 5
0 b 6
0 C 7
0 c 8
0 D 9
0 d 10
0 E 11
0 e 12
0 F 13
0 f 14
0 G 15
0 g 16
0 H 17
0 h 18
0 I 19
0 i 20
0 J 21
0 K 22
0 L 23
0 M 24
0 P 25
0 R 26
0 S 27
0 SU 28
0 X 29
0 XX 30
0 Y 31
1 01 32
1 1 33
1 1A 34
2 02 35
2 2 36
2 2. 37
3 03 38
3 3 39
4 04 40
4 4 41
5 05 42
5 5 43
6 06 44
6 6 45
7 07 46
7 7 47
8 08 48
8 8 49
9 09 50
9 9 51
10 10 52
11 11 53
12 12 54
13 13 55

【问题讨论】:

您的问题是明确表示 1 已正确排序,但 0 未正确排序。 【参考方案1】:

一种方法是将TRY_CONVERTCASE 表达式一起使用:

ORDER BY CASE WHEN TRY_CONVERT(int,REVISION) IS NULL THEN 0 ELSE 1 END,
         REVISION

这将首先排序无法转换的值,这将是您的 alpha(数字)值,然后是可以转换的值。然后,在这些组中,它会按字母顺序排列它们,即'AB''CD' 之前,'12''2' 之前。

如果您希望数值按数字排序,我个人建议您修复您的设计,并将数值与 alpha 分开存储。如果你“不能”,那么你需要单独的子句:

ORDER BY CASE WHEN TRY_CONVERT(int,REVISION) IS NULL THEN 0 ELSE 1 END,
         CASE WHEN TRY_CONVERT(int,REVISION) IS NULL THEN REVISION END,
         TRY_CONVERT(int,REVISION)

【讨论】:

【参考方案2】:

我的建议是对rn 的计算进行逻辑更改。然后使用rn 进行订购:

SELECT D.PRIO, D.REVISION,
       ROW_NUMBER() OVER (ORDER BY PRIO, (CASE WHEN REVISION IN ('0', '00') THEN 1 ELSE 2 END) DESC, REVISION ) AS RN
FROM (SELECT DISTINCT CONVERT(INT, LEFT(REVISION, PATINDEX('%[^0-9]%', REVISION+'z')-1)) as PRIO,
             REVISION 
      FROM DOCUMENTS
     ) D
ORDER BY RN 

【讨论】:

感谢您的建议。这行得通,只是我需要更正语法:(CASE WHEN REVISION IN ('0', '00') THEN 1 ELSE 2 END)。

以上是关于sql server 按字母顺序排序,然后是数字的主要内容,如果未能解决你的问题,请参考以下文章

937. 重新排列日志文件(Python)

首先按字母顺序对对象数组进行排序,然后按数字排序

php 按字母顺序排序数组然后按数字排序

按数字(最高优先)然后按字母(字母顺序)对对象集合进行排序

Pandas str 按字母顺序然后按数字

按字母数字字符串 MS SQL Server 2012 中的相似性排序