SQL Server将字符串转换为数字和排序

时间:2017-05-23 18:48:13

标签: sql sql-server-2008 sql-server-2012

我正在尝试对一列字符串进行排序,其中包含一个字母数字字符和一个数字。如果我运行这个:

select 
    column_name 
from 
    table_name 
where 
    item_type = 'ABC' 
    and item_sub_type = 'DEF' 
order by 
    cast(replace([column_name], 'A', '') as Numeric(10, 0)) desc

我得到了正确的排序输出:

A218
A217
A216

但如果我试图抢到最上一行

select top 1 
    column_name 
from 
    table_name 
where 
    item_type = 'ABC' 
    and item_sub_type = 'DEF' 
order by 
    cast(replace([column_name], 'A', '') as numeric(10, 0)) desc

失败并出现以下错误:

  

将数据类型varchar转换为数字

时出错

关于如何选择最上一行的任何想法?

谢谢!

3 个答案:

答案 0 :(得分:0)

我认为这是您数据的问题 - 并非所有数据都符合您的模式。 您可以使用以下方法检查无效内容:

select column_name from table_name where ISNUMERIC(replace([column_name],'A','')) = 0

答案 1 :(得分:0)

我认为这是优化器没有执行您的查询,您希望如何。我的意思是SQL是一种声明性语言 - 您的查询只是说明您要完成的 ,而不是 您正在尝试完成它(在大多数情况下)。因此,优化器确定最佳方式,在您的情况下,以某种顺序执行导致错误的事情。尝试用CTE强制你的逻辑。

with cte as(
select column_name, [item_value] 
from table_name 
where item_type='ABC' and item_sub_type='DEF')

select top 1 column_name
from cte 
ORDER BY CAST(replace([item_value],'A','') AS Numeric(10,0)) desc

SQL Server 2012/2016

select top 1 column_name 
from table_name 
where item_type='ABC' and item_sub_type='DEF' 
order by TRY_CONVERT(Numeric(10,0),replace([column_name],'A','')) desc

答案 2 :(得分:0)

通过删除前缀并转换为int来排序,只要前缀是唯一的非数字,其余的应该是纯数字。

select 
    column_name 
from 
    table_name 
where 
    item_type = 'ABC' 
    and item_sub_type = 'DEF' 
order by 
    cast(replace([column_name], 'A', '') as Int) desc

上面的脚本应该正常工作,我认为你的数据存在问题可能有多个值......

见下面的例子

declare @mytable table
(
code varchar(10) 
)

insert into @mytable
values 
('A323'),
('A223'),
('A123'),
('A553'),
('A923'),
('A23'),
('A235')



select 
    code
from 
    @mytable 
order by 
    cast(replace(code, 'A', '') as Int) desc


code
----------
A923
A553
A323
A235
A223
A123
A23