【问题标题】:Sorting empty values last instead of first最后排序空值而不是第一个
【发布时间】:2011-09-25 09:53:32
【问题描述】:

我正在尝试实现一个排序过程,该过程将根据下拉列表的值进行排序。发生的情况是,在对列表进行排序时,NULL 字段将被指定的替换值替换,在本例中为 ''。这是首先排序的,因为我们是按升序排序的,现在我想用空值 LAST 升序排序 BUT。我该如何实现呢?

ORDER BY l.IsActive DESC, 
        CASE WHEN @SortOrder = 1 THEN n.DisplayName
             WHEN @SortOrder = 2 THEN CASE ec.IsEquipmentRelated
                                            WHEN  1 THEN ISNULL(el.ShopID,'') + 
                                                    ISNULL(ec.EquipmentAbbr,'') + 
                                                    ISNULL(el.ClassSequenceNumber,'') + 
                                                    ISNULL(el.EquipmentComponent,'') + 
                                                    ISNULL(el.CompSequenceNumber,'')
                                            WHEN  0 THEN ISNULL(ec.EquipmentAbbr,'')
                                            ELSE NULL
                                      END
             ELSE l.DisplayName
        END

编辑:运行 MS SQL Server 2008 / T-SQL

编辑: @Joe Stefanelli,我试过了,它没有编译:

ORDER BY l.IsActive DESC, 
    CASE WHEN @SortOrder = 0 THEN l.DisplayName
         WHEN @SortOrder = 1 THEN CASE WHEN n.DisplayName = '' THEN 2 ELSE 1 END, n.DisplayName
         WHEN @SortOrder = 2 THEN 
                                  CASE ec.IsEquipmentRelated
                                        WHEN  1 THEN ISNULL(el.ShopID,'') + 
                                            ISNULL(ec.EquipmentAbbr,'') + 
                                            ISNULL(el.ClassSequenceNumber,'') + 
                                            ISNULL(el.EquipmentComponent,'') + 
                                            ISNULL(el.CompSequenceNumber,'')
                                        WHEN  0 THEN ISNULL(ec.EquipmentAbbr,'')
                                        ELSE NULL
                                  END
     END

【问题讨论】:

  • @Matthew Cox tsql 标签向我表明它的 SQL Server。虽然哪个版本可以帮助

标签: sql sql-server tsql sorting stored-procedures


【解决方案1】:
...
ORDER BY CASE WHEN YourField = '' THEN 2 ELSE 1 END, YourField

【讨论】:

  • 我不太明白THEN 2 ELSE 1 END, 部分...你在简化吗?
  • @JFB:我只是为了排序目的引入了一个人工元素。当您的字段为空字符串时,我们使用 2 else 1。因此,设想排序结果类似于 (1, 'alpha'), (1, 'bravo'), ..., (1, 'zulu'), (2, '')
  • 好的...我已经尝试过这种方法,请查看我上面的编辑。
【解决方案2】:

最好的方法是添加一个具有排序顺序值的派生列(检查另一列是否为空的 CASE),然后按该列排序。

【讨论】:

    【解决方案3】:

    您的第二个 sn-p 将无法编译,因为您试图在外部 CASE 的 WHEN @SortOrder = 1 分支中返回多个值。如果您对上述分支进行了一些微小的更改,您可以修复它:

    1. 21分别更改为'2''1'

    2. 将逗号 (,) 替换为连接运算符 (+)。

    因此生成的 ORDER BY 子句将如下所示:

    ORDER BY
      l.IsActive DESC, 
      CASE
        WHEN @SortOrder = 0 THEN l.DisplayName
        WHEN @SortOrder = 1 THEN
          CASE WHEN n.DisplayName = '' THEN '2' ELSE '1' END + n.DisplayName
        WHEN @SortOrder = 2 THEN 
          CASE ec.IsEquipmentRelated
            WHEN  1 THEN
              ISNULL(el.ShopID,'') + 
              ISNULL(ec.EquipmentAbbr,'') + 
              ISNULL(el.ClassSequenceNumber,'') + 
              ISNULL(el.EquipmentComponent,'') + 
              ISNULL(el.CompSequenceNumber,'')
            WHEN  0 THEN
              ISNULL(ec.EquipmentAbbr,'')
            ELSE NULL
          END
      END
    

    【讨论】:

      【解决方案4】:

      好的!我找到了一种结合所有三个答案来解决这个问题的方法。每个答案+1!我所做的是首先创建一个“虚拟”派生列,将 null 值分配给 1,将非 null 值分配给 0,首先对其进行排序,然后对其余部分进行排序:

      ORDER BY 
         l.IsActive DESC, 
         CASE
          WHEN @SortOrder = 0 THEN (Case When l.DisplayName Is Null Then 1 Else 0 End)
          WHEN @SortOrder = 1 THEN (Case When n.DisplayName Is Null Then 1 Else 0 End)
          WHEN @SortOrder = 2 THEN (Case When ec.EquipmentAbbr Is Null Then 1 Else 0 End)
         END,
         CASE 
            WHEN @SortOrder = 0 THEN l.DisplayName
            WHEN @SortOrder = 1 THEN n.DisplayName
            WHEN @SortOrder = 2 THEN 
                     ISNULL(el.ShopID,'') + 
                     ISNULL(ec.EquipmentAbbr,'') + 
                     ISNULL(el.ClassSequenceNumber,'') + 
                     ISNULL(el.EquipmentComponent,'') + 
                     ISNULL(el.CompSequenceNumber,'')
         END
      

      这样,一个字段是否为空的排序是在实际排序完成之前完成的,这会将空值放在最后。

      【讨论】:

        猜你喜欢
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-20
        • 2019-03-24
        相关资源
        最近更新 更多