【问题标题】:Force numerical order on a SQL Server 2005 varchar column, containing letters and numbers?在 SQL Server 2005 varchar 列上强制数字顺序,包含字母和数字?
【发布时间】:2010-09-09 16:12:29
【问题描述】:

到目前为止,我有一列包含字符串 'Operator (1)' 等等,直到 'Operator (600)'。

我想让它们按数字排序,我想出了

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

这是非常非常丑陋的。

更好的建议?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      通过 dbo.udfSortOperator(colname) 从表顺序中选择 colname

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          好吧,首先定义那个列的含义。运算符是一个名称,因此您可以使用字符来证明其合理性吗?或者它是一个数字?

          如果字段是名称,那么您将使用字符,然后您会想要确定固定长度。在左侧用零填充所有运算符名称。定义运算符的命名规则(即没有字母。或者您将在“A001”等系列中​​使用的代码)

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

          如果操作符是一个数字,那么你得到了该列的数据类型错误,需要更改。

          【讨论】:

            【解决方案5】:

            索引计算列

            如果您发现自己经常对operator 列进行排序或查询,请考虑为其数值创建一个计算列并为其添加索引。这将为您提供一个计算/持久列(这听起来像矛盾,但不是)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-05
              • 1970-01-01
              • 1970-01-01
              • 2011-01-04
              • 2015-07-13
              • 1970-01-01
              相关资源
              最近更新 更多