65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 SQL 中对字母数字数据进行排序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.42/5 (4投票s)

2010 年 1 月 11 日

CPOL

1分钟阅读

viewsIcon

91036

在 SQL 中对字母数字数据进行排序。

引言

如果您的 SQL 查询没有按您期望的顺序返回结果集,本文可能有助于解决此问题。

背景

我们都知道 ORDER BY 关键字用于按指定的列对结果集进行排序。在大多数情况下,它工作得很好。但是,对于字母数字数据,它可能不会返回您期望的结果集。本文解释了如何轻松修复此问题。

Using the Code

步骤 1

我创建了一个名为“Test”的表,其中包含两个列,如下所示

以下数据已添加到“Test”表中

image002.jpg

以下 SQL 查询中的“Order By”可能不会按正确的顺序返回结果集。

Select ID From TestOrder by ID

image003.jpg

第二步

我已经修改了 ORDER BY 子句,如下所示,并且它返回了正确顺序的结果。

(注意:ID 列定义为 varchar(20)。因此,我执行以下操作来解决此问题

  • 如果 ID 是数字,则在 ID 值前面添加 21 个 '0' 并获取最后 20 个字符
  • 如果 ID 不是数字,则在 ID 值末尾添加 21 个 '' 并获取前 20 个字符
Select ID 
From Test
ORDER BY
Case When IsNumeric(ID) = 1 then Right(Replicate('0',21) + ID, 20)
     When IsNumeric(ID) = 0 then Left(ID + Replicate('',21), 20)
     Else ID
End

image004.jpg

步骤 3

我修改了查询以返回行号(用于分页),并且它有效!

(注意ROW_NUMBER 仅适用于 SQL Server 2005 及更高版本。)

Select Row_Number() Over (Order by
Case When IsNumeric(ID) = 1 then Right(Replicate('0',21) + ID, 20)
                          When IsNumeric(ID) = 0 then Left(ID + Replicate('',21), 20)
                        Else ID
               END) As RowNumber,
ID
From Test

image005.jpg

欢迎提出任何建议/评论!

关注点

可能有更好的方法来做到这一点。请分享您的想法。

历史

  • 2010 年 1 月 7 日:初始版本。
© . All rights reserved.