nvarchar的列去掉前三个字符变成数字排序 取最大值

时间:2022-05-09 15:10:36
nvarchar的列去掉前三列变成数字排序  并取最大值

如一个列为
ab1234
ab1235
ab1233
ab2233 
   重新取值从大到小排序结果为
2233
1234
1234
1233
最大值为2233

4 个解决方案

#1


select max(cast(substring(cname, 4 , len(cname)) as int))
from t

#2


引用 1 楼 wmxcn2000 的回复:
select max(cast(substring(cname, 4 , len(cname)) as int))
from t

这个可以,怎么去掉转换出错的行
有的输错了 ab1234aa ab1234bb   

#3


引用 1 楼 wmxcn2000 的回复:
select max(cast(substring(cname, 4 , len(cname)) as int))
from t
将 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
   


nvarchar的列去掉前三个字符变成数字排序 取最大值

#1


select max(cast(substring(cname, 4 , len(cname)) as int))
from t

#2


引用 1 楼 wmxcn2000 的回复:
select max(cast(substring(cname, 4 , len(cname)) as int))
from t

这个可以,怎么去掉转换出错的行
有的输错了 ab1234aa ab1234bb   

#3


引用 1 楼 wmxcn2000 的回复:
select max(cast(substring(cname, 4 , len(cname)) as int))
from t
将 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
   


nvarchar的列去掉前三个字符变成数字排序 取最大值