将nvarchar列排序为整数

时间:2020-03-06 14:46:29  来源:igfitidea点击:

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

结果示例:

  • 1个
  • 2个
  • 3
  • ...
  • 10
  • 11
  • ...
  • a
  • 亚伯
  • b
  • BA
  • BA
  • ...

解决方案

丢掉它。

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

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

我们可以将数据同时视为字母数字或者数字,而不要同时使用。我认为我们尝试做的事情是不可能的,数据模型的设置不正确。

I don't think what you're trying to do
  is possible

这个例子很好用

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

结果是:

  • 一种
  • b
  • C
  • ...
  • 1个
  • 2个
  • 3

但是我首先需要数字。

-检查是否存在
如果存在(从dbo.sysobjects中选择*,其中[id] = object_id(N'dbo.t')AND objectproperty(id,N'IsUserTable')= 1)
删除表dbo.t

-创建示例表
创建表dbo.t(c varchar(10)不为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的情况下,然后将cast(c转换为int)否则为0结束,
C

用这个:

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结果的额外临时列。它执行起来可能并不快。

如果我们用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语句的每个分支返回相同的数据类型非常重要,否则我们将得到不正确的结果或者错误。

这应该工作:

select * from Table order by ascii(Column)