我有一列包含字符串 'Operator (1)' 等等,直到 'Operator (600)' 为止。
我想让它们按数字排序,我想出了
select colname from table order by
cast(replace(replace(colname,'Operator (',''),')','') as int)
这是非常非常丑陋的。
更好的建议?
我有一列包含字符串 '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) 中,或者创建一个计算列来隐藏丑陋的字符串操作。你所拥有的似乎很好。
如果您确实必须以您拥有的格式保留数据 - 并且添加数字排序顺序列是更好的解决方案 - 然后考虑将文本操作包装在用户定义的函数中。
通过 dbo.udfSortOperator(colname) 从表顺序中选择 colname
它不那么难看,给你一些抽象。函数调用会产生额外的开销,但对于在不太严重的数据库服务器中包含数千行的表来说,这不是主要问题。在功能中做笔记,以便以后根据需要进行优化。
我的答案是改变问题。如果可能的话,我会在表中添加一个 operatorNumber 字段。更改更新/插入例程以提取数字并存储它。这样,每条记录的字符串转换命中只有一次。
每次运行查询时,排序逻辑都需要进行字符串转换。
好吧,首先定义该列的含义。运算符是一个名称,因此您可以使用字符来证明其合理性吗?或者它是一个数字?
如果该字段是名称,那么您将使用字符,然后您需要确定固定长度。在左侧用零填充所有运算符名称。定义运算符的命名规则(即没有字母。或者您将在“A001”之类的系列中使用的代码)
索引将对服务器中的物理数据进行排序。正确定义的文本命名将在查询中对它们进行排序。你会想要两者。
如果运算符是一个数字,那么你得到了该列的数据类型错误,需要更改。
索引计算列
如果您发现自己operator
经常对列进行排序或以其他方式查询,请考虑为其数值创建计算列并为其添加索引。这将为您提供一个计算/持久列(这听起来像矛盾,但不是)。