强制SQL Server 2005 varchar列上的数字顺序,包含字母和数字?

时间:2008-09-16 18:19:25

标签: sql sql-server sql-order-by

我有一个包含字符串'Operator(1)'的列,依此类推,直到'Operator(600)'为止。

我想让他们按照数字命令,我想出了

select colname from table order by 
cast(replace(replace(colname,'Operator (',''),')','') as int)

非常非常难看。

更好的建议?

5 个答案:

答案 0 :(得分:2)

就是这样,InStr()/ SubString(),将Operator(1)更改为Operator(001),将n分别存储在Operator(n)中,或者创建一个隐藏丑陋字符串操作的计算列。你有什么似乎很好。

答案 1 :(得分:1)

如果您确实 以您所拥有的格式保留数据 - 并且添加数字排序顺序列是更好的解决方案 - 那么请考虑将文本操作包装在用户定义的函数中。

通过dbo.udfSortOperator(colname)

从表顺序中选择colname

它不那么难看,给你一些抽象。函数调用还有一个额外的开销,但是在一个不太严重的数据库服务器中包含数千行的表上,这不是一个主要问题。在功能中做笔记,以便以后根据需要进行光学处理。

答案 2 :(得分:0)

我的回答是改变问题。如果可能的话,我会在表中添加一个operatorNumber字段。更改更新/插入例程以提取数字并存储它。这样,字符串转换命中每个记录只有一次。

每次运行查询时,排序逻辑都需要进行字符串转换。

答案 3 :(得分:0)

好吧,首先要定义该列的含义。操作员是一个名字,所以你可以证明使用字符是正确的吗?或者是一个数字?

如果字段是名称,那么您将使用字符,然后您需要确定固定长度。用左边的零填充所有运算符名称。为运营商定义命名规则(I.E.没有leters。或者你将在“A001”系列中使用的代码)

索引将对服务器中的物理数据进行排序。正确定义文本命名将对查询进行排序。你会想要两个。

如果运算符是数字,则表示该列的数据类型错误,需要更改。

答案 4 :(得分:0)

索引计算列

如果您经常订购或以其他方式查询operator列,请考虑为其数值创建计算列并为其添加索引。这将给你一个计算/持久列(听起来像矛盾,但不是)。