代码之家  ›  专栏  ›  技术社区  ›  Vinko Vrsalovic

是否强制对包含字母和数字的SQL Server 2005 varchar列进行数字排序?

  •  0
  • Vinko Vrsalovic  · 技术社区  · 17 年前

    我有一列包含字符串“运算符(1)”,以此类推,直到“运算符(600)”为止。

    我想把它们按数字顺序排列,我已经想出了

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

    这是非常非常丑陋的。

    更好的建议?

    5 回复  |  直到 9 年前
        1
  •  2
  •   Joel Coehoorn    17 年前

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

        2
  •  1
  •   Cruachan    17 年前

    如果你真的 为了保持数据的格式不变,添加一个数字排序列是更好的解决方案,那么可以考虑将文本操作封装在用户定义的函数中。

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

    它不那么丑陋,给你一些抽象。函数调用还有额外的开销,但在一个不太受影响的数据库服务器中,对于一个包含数千行的表来说,这不是一个主要问题。在功能中做笔记,以便以后根据需要进行验光。

        3
  •  0
  •   doug Nelson doug Nelson    17 年前

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

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

        4
  •  0
  •   Ricardo C    17 年前

    好吧,首先定义一下那列的含义。运算符是否是一个名称,以便您可以证明使用字符的合理性?还是一个数字?

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

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

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

        5
  •  0
  •   Constantin    17 年前

    索引计算列

    如果您发现自己在订购或以其他方式查询 operator 列通常,考虑为其数值创建一个计算列并为其添加索引。这将为您提供一个计算/持久列(听起来像矛盾修饰法,但事实并非如此)。