NVARCHAR类型ID按位数(6到7)再按数值升序排序的实现方法
解决NVARCHAR类型ID的按位数+数值排序问题
这个问题我碰到过好几次啦,因为NVARCHAR类型的字段排序是按字符编码顺序来的,不是咱们直觉里的数值顺序,所以直接用ORDER BY ID DESC肯定得不到想要的结果。你想要先按位数从6到7排列,再按数值从小到大排序,咱们可以这么写SQL:
SELECT * FROM score ORDER BY LEN(ID) ASC, CAST(ID AS BIGINT) ASC;
各部分作用解释:
LEN(ID) ASC:先按ID的长度升序排序,这样6位的ID会全部排在7位ID的前面,完美满足你“从6到7”的排序优先级;CAST(ID AS BIGINT) ASC:对于同一长度的ID,我们把它转换成数值类型(这里用BIGINT是因为7位数字的最大值远小于BIGINT的取值范围,不会溢出),再按数值升序排列,这样就能保证992199 < 992425 < 1001111的正确数值顺序啦。
额外小提示:
如果你的ID字段里有可能存在非数字字符(虽然你的例子里都是数字),建议用TRY_CAST替代CAST,这样遇到非数字的ID时不会直接报错,而是会返回NULL,这类记录会被排到最后(取决于数据库的排序规则):
SELECT * FROM score ORDER BY LEN(ID) ASC, TRY_CAST(ID AS BIGINT) ASC;
内容的提问来源于stack exchange,提问作者ericso
相关产品推荐
相关产品推荐

