想问下,sql 按 in 后的顺序排序问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想问下,sql 按 in 后的顺序排序问题。相关的知识,希望对你有一定的参考价值。

看网上写的使用charindex()函数,但是数据量小的时候可以正常,但是数据量稍大一点,就会出现错误。开头几条和结束几条没问题,中间就混乱了。。不知道具体原因
没分了!~~

那你把charindex(rtrim(id),'//序列') as Sort
作为一个字段放在select里面,然后再用Sort字段排序,试试看
select *, charindex(rtrim(id),'//序列') as sort from tbname where id in(//序列) order by sort
参考技术A 中间的数据有问题吧.

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

【中文标题】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 按 in 后的顺序排序问题。的主要内容,如果未能解决你的问题,请参考以下文章

如何按 Oracle SQL IN() 子句中的值顺序对结果数据进行排序

mysql in 排序 也可以按in里面的顺序来排序

php sql 中WHERE 的条件:IN(3,2,5,8) 结果如何按IN中的顺序排序

让sql语句不排序,按照in语句的顺序返回结果

根据列表的顺序对过滤后的查询集进行排序

我想问下SQL里的decimal是啥函数?