我有这样的数据。
1000/PST-FDI/XII/2016
999/PST-TGR/XII/2016
998/PST-TGL/XII/2016
997/PST-SPM/XII/2016
996/PST-SPG/XII/2016
995/PST-SMG/XII/2016
994/PST-SMD/XII/2016
993/PST-SLT/XII/2016
序列号的格式值是" SequenceNo / BranchCode / Month / Year"。我想在今年选择最后一个序列号。我已经通过serialNo desc从表顺序中选择了前1 *,但它显示了我999 / PST-TGR / XII / 2016。我不知道为什么。
我尝试制作这样的功能
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[getFirstNumeric](
@s VARCHAR(50)
)
RETURNS int AS
BEGIN
set @s = substring(@s,patindex('%[0-9]%',@s),len(@s)-patindex('%[0-9]%',@s) + 1)
if patindex('%[^0-9]%',@s) = 0
return @s
set @s = substring(@s,1,patindex('%[^0-9]%',@s)-1)
return cast(@s as int)
end
它也为我显示999 / PST-TGR / XII / 2016。或者因为我制作了DESC,所以最新消息“PST-TGR' ??那么如何根据当年注意到序列号呢?
答案 0 :(得分:1)
因为字符串排序是999
降序1000
之前的降序
试试这个
Order by cast(left(col,charindex('/',col)-1) as int) desc --,cast(right(col,4) as int) desc
根据输入, LEFT/RIGHT
返回类型为Varchar/Nvarchar
。因此,我们需要明确转换为INT
以获得正确的排序
答案 1 :(得分:0)
试试这个
!
答案 2 :(得分:0)
试试这个。
使用子字符串:
select * from ( select * ,
cast(left(
(substring(Colname, patindex('%[0-9]%', Colname),
len(Colname))), patindex('%[^0-9]%',
(substring(Colname, patindex('%[0-9]%', Colname), len(Colname))) ) - 1)as int) as serailID
from Tablename
)a
order by serailID desc
检查Demo
使用功能:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION [dbo].[getFirstNumeric](
@s VARCHAR(50)
)
RETURNS int AS
BEGIN
set @s = left(
(substring(@s, patindex('%[0-9]%', @s),
len(@s))), patindex('%[^0-9]%',
(substring(@s, patindex('%[0-9]%', @s), len(@s))) ) - 1)
if patindex('%[^0-9]%',@s) = 0
return @s
set @s = substring(@s,1,patindex('%[^0-9]%',@s)-1)
return cast(@s as int)
end
select *, dbo.getFirstNumeric(columnname) as serailno1
from TableName
order by dbo.getFirstNumeric(serailno1) desc