强制 SQL Server 2005 varchar 列上包含字母和数字的数字顺序?
-
09-06-2019 - |
题
我有一列包含字符串“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
通常,考虑为其数值创建计算列并为其添加索引。这将为您提供一个计算/持久列(这听起来像是矛盾的,但事实并非如此)。