强制在SQL Server 2005 varchar列上包含字母和数字的数字顺序?
我有一列包含字符串" Operator(1)",依此类推,直到" Operator(600)"为止。
我想按数字顺序排列它们,然后我想出了
select colname from table order by cast(replace(replace(colname,'Operator (',''),')','') as int)
这是非常非常丑陋的。
更好的建议?
解决方案
回答
就是这样,InStr()/ SubString(),将Operator(1)更改为Operator(001),将n分别存储在Operator(n)中,或者创建一个计算列以隐藏丑陋的字符串操作。我们所拥有的似乎还不错。
回答
我的答案是改变问题。如果可能的话,我会在表中添加一个operatorNumber字段。更改更新/插入例程以提取数字并存储它。这样,字符串转换命中每个记录只有一次。
每次运行查询时,排序逻辑都将要求字符串转换。
回答
好吧,首先定义该列的含义。运算符是一个名称,以便我们可以使用char进行辩解吗?还是数字?
如果该字段是名称,则将使用字符,然后将要确定固定长度。在所有运算符名称的左边加零。定义运算符的命名规则(例如,不使用letter。或者我们将在" A001"等系列中使用的代码)
索引将对服务器中的物理数据进行排序。正确定义的文本命名将对查询进行排序。你们两个都想要。
如果运算符是数字,则该列的数据类型错误,需要更改。
回答
如果确实必须保留数据格式,并添加数字排序顺序列是更好的解决方案,则可以考虑将文本操作包装在用户定义的函数中。
通过dbo.udfSortOperator(colname)从表顺序中选择colname
它不那么丑陋,可以给我们一些抽象。函数调用会带来额外的开销,但是在命中率不太高的数据库服务器中包含数千行的表上,这并不是主要问题。在功能中记下注释,以便以后根据需要进行优化。
回答
索引计算列
如果我们发现自己经常在" operator"列上订购或者查询,请考虑为其数值创建一个计算列并为其添加索引。这将为我们提供一个计算/持久列(听起来像oxymoron,但不是)。