sqlserver中的order by 功能大部分人只会使用时间或者字段进行排序,其效率较为低下
最近有提出需求需要按照某个工序进行排列(特定工序),一开始思考是想通过两次视图,第一次将某个工序替换成数字,第二次在通过数字进行排列,但是思考后发现该方法较为负责且费时,在通过检索度娘后发现,sqlserver是含有自定义排序功能的
以下为代码部分:

select
        TOP 100 PERCENT  p.序号,
        p.内部编号,
        p.工序,
        p.制表日期 as 最新报工时间,
        p.措施,
        铸件工艺单细则.排箱号,
        v.计划时间 as 造型计划时间,
        p.审批时间 as 结构评审完成时间
    from
        ( 
        select
            序号,
            审批时间,
            内部编号5 as 内部编号,
            isnull(x.工序,
            '未生产') as 工序,
            x.制表日期,
            措施38 as 措施
        from
            新模型结构评审表
        left join
            在制工序2 x
                on x.内部编号=substring(内部编号5,
            0,
            convert(int,
            replace(isnull(convert(int,
            charindex('/',
            内部编号5)),
            0),
            0,
            datalength(内部编号5))))
        where
            内部编号5<>''
            and 措施38 <>''
    ) p
left join
    铸件工艺单细则  on. 铸件工艺单细则.内部编号=substring(p.内部编号,             0,             convert(int,             replace(isnull(convert(int,             charindex('/',            p.内部编号)),             0),             0,             datalength(p.内部编号))))
left join
    (
        select
            TOP 100 PERCENT 工序,
            排箱号,
            计划时间
        from
            模检淋涂计划表
        where
            工序='造型'
    )v
        on v.排箱号=铸件工艺单细则.排箱号
where
    p.审批时间>'2019-07-20'
order by
    CHARINDEX(RTRIM(CAST(p.工序 as NCHAR)),
    '组箱,模检,淋涂烘干一,淋涂烘干二,补强,造型,熔炼浇注,解箱,粗抛,清砂,精抛,检查称重,喷漆,入库,未生产')

其中主要起到排序作用的是最下方的order by 后面的语句,它可以通过将某个字段自定义后,按照一定格式进行排序,例如以上代码可以通过将工序这个字段,按照 组箱,模检,淋涂烘干一,淋涂烘干二,补强,造型,熔炼浇注,解箱,粗抛,清砂,精抛,检查称重,喷漆,入库,未生产 这个顺序依次进行排序,在排序前发生过一个问题,这个排序无法识别空字符串及null,也就是代码中这个类别如果为空,则无法将它排序到最后面,这里我在之前用isnull做了非空的操作,将空值也进行了排序