我有混合数据i nvarchar列(单词和数字)。 这是以数字顺序对此列中的数据进行排序的最快方法。
结果示例:
答案 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)
- 填充示例表
插入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
结果是:
但我首先需要数字。
答案 5 :(得分:-1)
这应该有效:
select * from Table order by ascii(Column)
答案 6 :(得分:-2)
施展它。
SELECT * FROM foo ORDER BY CAST(somecolumn AS int);
自从我触及SQL Server以来已经有一段时间了,所以我的语法可能完全不正确:)