1

我在 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

我的问题是我不知道从哪里开始。此数据通过在 Classic ASP (VBScript) 上运行的网站呈现,因此在检索记录集后可以在那里进行一些重组。

我怎样才能做到这一点?

4

2 回答 2

1

如果您所有的数据都具有相同的格式,试试这个怎么样?

ORDER BY CAST(REPLACE(column_name,'/','.') AS NUMERIC(19,4))
于 2013-09-25T13:35:20.927 回答
1

为了满足主要排序要求(我错过了@EricZ 捕获的次要排序):

ORDER BY CONVERT(INT, LEFT(column_name, CHARINDEX('/', column_name)-1));

为避免像 之类的值出现转换错误GE0,您必须说:

ORDER BY CASE WHEN column_name NOT LIKE '%[^/0-9]%' THEN
  CONVERT ... END

即使有一个WHERE子句将它们过滤掉,您也不能保证过滤器是否会在尝试任何转换之前发生。

当然,这将是一个非常昂贵的排序操作——你最好提前分离这两个单独的信息(例如将它们存储为单独的列)或者添加一个计算列。

于 2013-09-25T13:28:27.893 回答