2020-06-12 16:24:59 版本 : SqlServer 将类似于1.1.1数据进行排序
作者: 周杨 于 2020年06月12日 发布在分类 / 计算机应用 / 数据库 / SQLSERVER 下,并于 2020年06月12日 编辑
 历史版本

备注 修改日期 修改人
其他原因... 2020-06-12 16:33:36[当前版本] 系统管理员
CREAT 2020-06-12 16:24:59 系统管理员

转自:https://blog.csdn.net/qq_19299335/article/details/97784674



一、建表CodeOrder

DROP TABLE [dbo].[CodeOrder]
GO
CREATE TABLE [dbo].[CodeOrder] (
[code] varchar(255) NOT NULL 
)


GO


INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.1.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.1.2')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.1.3')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.1.4')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'2')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'2.1.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'2.1.10')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'2.1.2')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'2.1.3')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'3')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'4')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'5')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'5.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'5.1.1.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'5.1.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.2.1')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.2.10')
GO
GO
INSERT INTO [dbo].[CodeOrder] ([code]) VALUES (N'1.2.2')
GO
GO

粘贴图片



二、创建函数formatOrderId

CREATE FUNCTION [dbo].[formatOrderId](
@orderId VARCHAR(50),   --排序字段/需要格式化的数值,如column_name/1.1.1
@num  int,              --格式化后的数字每个段是几位数,默认4位
@separator VARCHAR(50)  --需要格式的的字段或者数值是以什么分隔符分隔的,默认为'.'
)
RETURNS  VARCHAR(50)
AS
BEGIN
    IF @num is NULL or @num = ''
    BEGIN
        SET @num=4               
    END
    IF @separator is NULL or @separator = ''
  BEGIN
        SET @separator='.'              
    END
    DECLARE @newOrderId VARCHAR(50)
  DECLARE @tempLen int
    SET @newOrderId=''
  set @tempLen=0
    WHILE LEN(@orderId)-LEN(REPLACE(@orderId,@separator,''))>0
    BEGIN
        set @tempLen=@num-LEN(LEFT(@orderId,PATINDEX('%'+@separator+'%',@orderId)-1))
        IF @newOrderId=''
        BEGIN
            SET @newOrderId=REPLICATE('0', @tempLen) + LEFT(@orderId,PATINDEX('%'+@separator+'%',@orderId)-1)   
        END
        ELSE
        BEGIN
            SET @newOrderId=@newOrderId+@separator+REPLICATE('0', @tempLen) + LEFT(@orderId,PATINDEX('%'+@separator+'%',@orderId)-1)
        END
        SET @orderId=RIGHT(@orderId,LEN(@orderId)-PATINDEX('%'+@separator+'%',@orderId))
    END
  set @tempLen=@num-LEN(@orderId)
  IF @newOrderId=''
    BEGIN
        SET @newOrderId=REPLICATE('0', @tempLen)+@orderId                 
    END
    ELSE
    BEGIN
        SET @newOrderId=@newOrderId+@separator+REPLICATE('0', @tempLen)+@orderId        
    END

    RETURN  @newOrderId
END

三、测试运行

select *,dbo.formatOrderId(code,5,'.') orderId from CodeOrder order  by orderId

结果:

粘贴图片


select *,REPLACE(code, '.', '-') code2,dbo.formatOrderId(REPLACE(code, '.', '-'),5,'-') orderId from CodeOrder order  by orderId


历史版本-目录  [回到顶端]
    知识分享平台 -V 5.1.4 -大信谛威