将nvarchar列排序为整数
我在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)