当前位置:  开发笔记 > 数据库 > 正文

如何在包含数字的SQL Server中对VARCHAR列进行排序?

如何解决《如何在包含数字的SQLServer中对VARCHAR列进行排序?》经验,为你挑选了4个好方法。

VARCHARSQL Server 2000数据库中有一个列,可以包含字母或数字.这取决于客户在前端配置应用程序的方式.

当它确实包含数字时,我希望它以数字方式排序,例如"1","2","10"而不是"1","10","2".只包含字母,字母和数字(如'A1')的字段可以按字母顺序排序.例如,这将是可接受的排序顺序.

1
2
10
A
B
B1

实现这一目标的最佳方法是什么?



1> Aleris..:

一种可能的解决方案是使用前面的字符填充数值,以便所有字符串具有相同的字符串长度.

以下是使用该方法的示例:

select MyColumn
from MyTable
order by 
    case IsNumeric(MyColumn) 
        when 1 then Replicate('0', 100 - Len(MyColumn)) + MyColumn
        else MyColumn
    end

100应与该列的实际长度来代替.



2> Cowan..:

有几种可能的方法可以做到这一点.

一个是

SELECT
 ...
ORDER BY
  CASE 
    WHEN ISNUMERIC(value) = 1 THEN CONVERT(INT, value) 
    ELSE 9999999 -- or something huge
  END,
  value

ORDER BY的第一部分将所有内容转换为int(非数值的巨大值,最后排序),然后最后一部分处理字母.

请注意,对于大量数据,此查询的性能可能至少是可怕的.



3> JohnB..:
SELECT *, CONVERT(int, your_column) AS your_column_int
FROM your_table
ORDER BY your_column_int

要么

SELECT *, CAST(your_column AS int) AS your_column_int
FROM your_table
ORDER BY your_column_int

我认为两者都相当便携.


正如OP所说,'your_column`也包括字母.您提出的解决方案不适用于包括字母在内的值.

4> Luke Bennett..:
select
  Field1, Field2...
from
  Table1
order by
  isnumeric(Field1) desc,
  case when isnumeric(Field1) = 1 then cast(Field1 as int) else null end,
  Field1

这将按照您在问题中给出的顺序返回值.

所有进行转换的性能都不会太高,所以另一种方法是在表中添加另一列,在该表中存储数据的整数副本,然后先按照该列进行排序,然后再对相关列进行排序.这显然需要对插入或更新表中数据的逻辑进行一些更改,以填充两列.要么是这样,要么在表上插入触发器以在插入或更新数据时填充第二列.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有