我正在尝试对一列字符串进行排序,其中包含一个字母数字字符和一个数字。如果我运行这个:
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转换为数字
时出错
关于如何选择最上一行的任何想法?
谢谢!
答案 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