如一个列为
ab1234
ab1235
ab1233
ab2233
重新取值从大到小排序结果为
2233
1234
1234
1233
最大值为2233
4 个解决方案
#1
select max(cast(substring(cname, 4 , len(cname)) as int))
from t
from t
#2
这个可以,怎么去掉转换出错的行
有的输错了 ab1234aa ab1234bb
#3
将 nvarchar 值 'aa' 转换为数据类型为 int 的列时发生语法错误。
#4
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([cname] nvarchar(28))
Insert #T
select N'ab1234bb' union all
select N'ab1235bb' union all
select N'ab1233' union all
select N'ab2233'
Go
--测试数据结束
SELECT SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1,
CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0
THEN LEN(cname)
ELSE PATINDEX('%[0-9][^0-9]%', [cname])
END - PATINDEX('%[^0-9][0-9]%', [cname])) AS ID
FROM #T
ORDER BY SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1,
CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0
THEN LEN(cname)
ELSE PATINDEX('%[0-9][^0-9]%', [cname])
END - PATINDEX('%[^0-9][0-9]%', [cname])) DESC
#1
select max(cast(substring(cname, 4 , len(cname)) as int))
from t
from t
#2
这个可以,怎么去掉转换出错的行
有的输错了 ab1234aa ab1234bb
#3
将 nvarchar 值 'aa' 转换为数据类型为 int 的列时发生语法错误。
#4
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([cname] nvarchar(28))
Insert #T
select N'ab1234bb' union all
select N'ab1235bb' union all
select N'ab1233' union all
select N'ab2233'
Go
--测试数据结束
SELECT SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1,
CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0
THEN LEN(cname)
ELSE PATINDEX('%[0-9][^0-9]%', [cname])
END - PATINDEX('%[^0-9][0-9]%', [cname])) AS ID
FROM #T
ORDER BY SUBSTRING([cname], PATINDEX('%[^0-9][0-9]%', [cname]) + 1,
CASE WHEN PATINDEX('%[0-9][^0-9]%', [cname]) = 0
THEN LEN(cname)
ELSE PATINDEX('%[0-9][^0-9]%', [cname])
END - PATINDEX('%[^0-9][0-9]%', [cname])) DESC