注意:我认为这是{em>没有重复this seemingly related question,因为我有实际的字符串包含一个数字而不是存储为字符串的整数另一个OP。
我正在寻找一种方法来输出按自然顺序排序的SQL字符串,它们包含一个数字中缀。例如,Windows资源管理器自然会这样做:
On DBA,我读到单独的数字没有按字母顺序排序的属性, 但是我确信在没有前导零的中缀数字中有一些方法,因为它们 非常重要。
在SQL Server 2008 R2中,我的方案有点像这样:
DECLARE @Table TABLE (ID INT, Name VARCHAR(10));
INSERT INTO @Table (ID, Name) VALUES
(1,'name1file'), (5,'name11file'),
(2,'name2file'), (6,'name20file'),
(3,'name3file'), (7,'name21file'),
(4,'name10file');
SELECT * FROM @Table ORDER BY Name COLLATE Latin1_General_100_BIN ASC;
示例性结果集:
Output got Output desired
ID | Name ID | Name
========== ==========
1 | name1file 1 | name1file
4 | name10file 2 | name2file
5 | name11file 3 | name3file
2 | name2file 4 | name10file
6 | name20file 5 | name11file
7 | name21file 6 | name20file
3 | name3file 7 | name21file
ID
列仅用于说明目的(在这种情况下,您只能ORDER BY ID
)。这只是我查询的VARCHAR
列。我尝试使用COLLATE
,但我试过的fn_helpcollations
都没有产生所需的顺序。
那么,是否有办法实现而不使用使用SUBSTRING
或PATINDEX
或CLR函数或其他提取数字的方法,可能是通过使用适当的整理?
如果没有,是否有理由在数以千计的整理中没有实现这种常见用例?我希望Windows资源管理器使用一些常见的排序规则,而不是像PHP的natsort()
那样的函数实现。
答案 0 :(得分:2)
如果您的文件名称格式为###文件,则可以使用
对其进行排序 SELECT * FROM @Table ORDER BY LEN(Name), Name
这种排序很简单,首先按名称的长度排序,然后按名称排序。您的文件名是固定的,只有数字部分已更改,因此" 5"," 1"和" 2"是"之前" 10"基于长度。第二个排序在相同幅度(0-9)(10-99)(100-999)之间的数字之间给出了正确的顺序。等等。
请记住,它不是完美的通用解决方案,例如:" z" < " AA"