相关文章推荐
豪爽的肉夹馍  ·  JAVA ...·  1 年前    · 
豪气的煎鸡蛋  ·  Java ...·  1 年前    · 
乖乖的红薯  ·  .net core - Blazor ...·  1 年前    · 


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

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

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