【问题标题】:Order By for NVARCHAR column in SQL ServerSQL Server 中 NVARCHAR 列的排序依据
【发布时间】:2012-02-13 18:23:25
【问题描述】:

我在 SQL Server 2005 中有一个 NVARCHAR(255) 列,其中包含字母或数字。

Declare @Temp Table(Name NVARCHAR(255))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('ccaaaaa')
Insert Into @Temp Values('cca')
Insert Into @Temp Values('cccc')
Insert Into @Temp Values('ccaa')

Select * From  @Temp Order by Name

此查询返回错误结果。有人能解释一下为什么吗?
另外,有人可以告诉我使用哪个查询来对值进行排序。
我想得到下一个序列:

1
2
3
10
aaaa
cca
ccaa
ccaaaaa
cccc

谢谢

【问题讨论】:

  • 查询返回正确结果。数据库使用丹麦字母!

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


【解决方案1】:

@Shark 向您展示了原因,我将在您的 SELECT 中向您展示一种解决方法,以获得您想要的结果:

Select * From  @Temp 
Order by 
    case isnumeric(name) 
       when 1 then cast(name as int) 
       else 999999999999999 end, 
    name

【讨论】:

  • @Shark 这是一个团队合作,当你在研究“为什么”时,我在研究“如何”:)
  • 哈哈好点,T.E.A.M. (大家一起成就更多)。 :)
  • 谢谢。数字现在还可以,但字母不在所需的句子中。我忘了提及。我有 SQL Server 2005 的速成版。有问题吗?
  • @SrdjanDejanovic 这个修复应该有效。 “字母不在所需的句子中”是什么意思?
  • @SrdjanDejanovic - 你错过了最后一行吗:name
【解决方案2】:

结果的实际顺序是这样的:

1
10
2
3
aaaa
cca
ccaa
ccaaaaa
cccc

SQL Server 之所以这样排序,是因为它是根据字符值进行排序的。换句话说,字符1 出现在2 之前,因为10 也会出现在2 之前。

所以你得到奇怪排序的原因是因为你是按字符串值排序的,而不是数字。

编辑:请参阅 Adrian 对解决方法的回答。

【讨论】:

  • 如果你提出解决方法,我会投票赞成coughcoughCASEcoughcough :)
  • @JNK 啊,阿德里安打败了我! :)
  • @JNK 你可能想看看我的回答;)
  • 谢谢。数字现在还可以,但字母不在所需的句子中。我忘了提及。我有 SQL Server 2005 的速成版。有问题吗?
  • @SrdjanDejanovic 那么字母的 char 值将跟随数字的 char 值,这就是为什么字母字符串排在数字字符串之后的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多