将nvarchar列排序为整数

时间:2008-09-26 09:43:21

标签: sql-server tsql sorting

我有混合数据i nvarchar列(单词和数字)。 这是以数字顺序对此列中的数据进行排序的最快方法。

结果示例:

  • 1
  • 2
  • 3
  • ...
  • 10
  • 11
  • ...
  • AAAA
  • AAAB
  • B'/ LI>
  • BA
  • BA
  • ...

7 个答案:

答案 0 :(得分:11)

使用此:

ORDER BY
    CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
    CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
    column

这可以按预期工作。


注意:您说最快的方式。这个sql对我来说很快就会产生,但是执行计划显示了一个表扫描,然后是一个标量计算。这可能会产生一个临时结果,其中包含该列的所有值以及ISNUMERIC结果的一些额外临时列。它的执行速度可能不快。

答案 1 :(得分:3)

如果您将数字保留为0并对其进行排序,您将获得所需的结果。您需要确保填充的0的数量与varchar列的大小相匹配。

看看这个例子......

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')

Select * From @Temp
Order By Case When IsNumeric(Data) = 1 
              Then Right('0000000000000000000' + Data, 20) 
              Else Data End

另请注意,使用case语句时,case语句的每个分支都返回相同的数据类型,否则会得到错误的结果或错误。

答案 2 :(得分:1)

- 检查是否存在 if exists(select * from dbo.sysobjects where [id] = object_id(N'dbo.t')AND objectproperty(id,N'IsUserTable')= 1)
    drop table dbo.t

- 创建示例表
create table dbo.t(c varchar(10)not null)

上设置nocount

- 填充示例表
插入dbo.t(c)值('1')
插入dbo.t(c)值('2')
插入dbo.t(c)值('3')
插入dbo.t(c)值('10')
插入dbo.t(c)值('11')
插入dbo.t(c)值('aaaa')
插入dbo.t(c)值('aaab')
插入dbo.t(c)值('b')
插入dbo.t(c)值('ba')
插入dbo.t(c)值('ba')

- 返回数据
从dbo.t中选择c 当isnumeric(c)= 1然后0其他1结束时,按顺序排列,
当isnumeric(c)= 1然后转换(c为int)时的情况,否则为0结束,
c

答案 3 :(得分:0)

您可以将数据视为字母数字或数字,而不是同时处理两者。我不认为你想要做的是什么,数据模型没有正确设置。

答案 4 :(得分:-1)

  

我不认为你想做什么   是可能的

此示例正常运行

SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END

结果是:

  • 一个
  • B'/ LI>
  • C
  • ...
  • 1
  • 2
  • 3

但我首先需要数字。

答案 5 :(得分:-1)

这应该有效:

select * from Table order by ascii(Column)

答案 6 :(得分:-2)

施展它。

SELECT * FROM foo ORDER BY CAST(somecolumn AS int);

自从我触及SQL Server以来已经有一段时间了,所以我的语法可能完全不正确:)