Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用文本存储值进行数字排序_Sql Server 2008_Tsql_Sorting_Asp Classic_Vbscript - Fatal编程技术网

Sql server 2008 使用文本存储值进行数字排序

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 相反,我希望将结果格式化为升序,以便这些端口按如下

我在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
我的问题是我一点也不知道从哪里开始。这些数据是通过运行在经典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我似乎对评论中的新行有问题。。。希望这一切都能顺利通过。。。