Sql server 2008 使用文本存储值进行数字排序
我在SQL Server 2008 R2中有一个表,其中包含物理电缆连接数据。此表中有一个nchar字段(文本),用于存储设备端口号。此字段不能为整数,因为某些端口为“GE0”或“1/15” 当运行查询从该表检索数据时,它将按端口号升序排序。问题是,因为字段存储文本,所以我得到如下文本排序结果:Sql server 2008 使用文本存储值进行数字排序,sql-server-2008,tsql,sorting,asp-classic,vbscript,Sql Server 2008,Tsql,Sorting,Asp Classic,Vbscript,我在SQL Server 2008 R2中有一个表,其中包含物理电缆连接数据。此表中有一个nchar字段(文本),用于存储设备端口号。此字段不能为整数,因为某些端口为“GE0”或“1/15” 当运行查询从该表检索数据时,它将按端口号升序排序。问题是,因为字段存储文本,所以我得到如下文本排序结果: 1/0 1/4 10/4 10/8 11/2 12/19 2/4 3/2 1/0 1/4 2/4 3/2 10/4 10/8 11/2 12/19 相反,我希望将结果格式化为升序,以便这些端口按如下
1/0
1/4
10/4
10/8
11/2
12/19
2/4
3/2
1/0
1/4
2/4
3/2
10/4
10/8
11/2
12/19
相反,我希望将结果格式化为升序,以便这些端口按如下顺序显示:
1/0
1/4
10/4
10/8
11/2
12/19
2/4
3/2
1/0
1/4
2/4
3/2
10/4
10/8
11/2
12/19
我的问题是我一点也不知道从哪里开始。这些数据是通过运行在经典ASP(VBScript)上的网站显示的,因此在检索记录集后可以在那里进行一些重新组织
如何实现这一点?为了满足主要排序要求(我错过了@EricZ捕获的次要排序): 为了避免像
GE0
这样的值出现转换错误,您必须说:
ORDER BY CASE WHEN column_name NOT LIKE '%[^/0-9]%' THEN
CONVERT ... END
即使使用WHERE
子句来过滤这些内容,您也无法保证在尝试任何转换之前是否会进行过滤
当然,这将是一个非常昂贵的排序操作-您最好提前分离这两个单独的信息(例如,将它们存储为单独的列),或者添加一个计算列。如果您的所有数据都具有相同的格式,那么尝试一下如何
ORDER BY CAST(REPLACE(column_name,'/','.') AS NUMERIC(19,4))
是否始终存在数字/数字或您提到的“GE0”值?如果是的话-你想如何排序?是的,我错过了第二个排序要求,在这种情况下,这是更好的。但是我的答案中的免责声明仍然适用,所以我将把它放在那里。好吧,我在这方面取得了一定的成功,在这个意义上,它以数字顺序将项目列在/的左边,但它仍然以文本顺序将项目列在/的右边。所以我看到的结果是这样的:1/23 2/0 2/1 2/20 2/2 2 2/21 10/24 10/27我似乎对评论中的新行有问题。。。希望这一切都能顺利通过。。。