如何从sql中的字符串值获取最大值

时间:2016-12-09 06:18:51

标签: sql sql-server

我有这样的数据。

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' ??那么如何根据当年注意到序列号呢?

3 个答案:

答案 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