Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将空值排序为最后一个,而不是第一个_Sql_Sql Server_Tsql_Sorting_Stored Procedures - Fatal编程技术网

Sql 将空值排序为最后一个,而不是第一个

Sql 将空值排序为最后一个,而不是第一个,sql,sql-server,tsql,sorting,stored-procedures,Sql,Sql Server,Tsql,Sorting,Stored Procedures,我正在尝试实现一个排序过程,它将根据下拉列表的值进行排序。当列表被排序时,空字段将被指定的替换值替换,在本例中为'。这是先排序的,因为我们是按升序排序的,现在我想按升序排序,但最后是空值。我如何实现这一点 ORDER BY l.IsActive DESC, CASE WHEN @SortOrder = 1 THEN n.DisplayName WHEN @SortOrder = 2 THEN CASE ec.IsEquipmentRelated

我正在尝试实现一个排序过程,它将根据下拉列表的值进行排序。当列表被排序时,空字段将被指定的替换值替换,在本例中为
'
。这是先排序的,因为我们是按升序排序的,现在我想按升序排序,但最后是空值。我如何实现这一点

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

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

您的第二个代码段将不会编译,因为当@SortOrder=1时,您试图在
分支中返回多个值。如果您对所述分支进行一些微小的更改,您可以修复它:

  • 例如,将
    2
    1
    分别更改为
    '2'
    '1'

  • 将逗号(
    )替换为连接运算符(
    +

  • 由此产生的ORDERBY子句如下所示:

    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
    

    好的!我已经找到了一个解决这个问题的方法,将这三个答案结合起来+每个答案1个!我所做的是首先创建一个“虚拟”派生列,将空值分配给1,将非空值分配给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
    

    通过这种方式,字段是否为空的排序在实际排序完成之前完成,这将在最后带来空值。

    @Matthew Cox tsql标记向我表明其SQL Server。虽然哪个版本会有帮助,但我并不真正理解
    然后2个其他1个结束,
    部分。。。你在简化吗?@JFB:我只是为了排序而引入了一个人工元素。当字段为空字符串时,我们使用2或1。因此,设想排序结果是类似于
    (1,'alpha'),(1,'bravo'),…,(1,'zulu'),(2,)
    ok。。。我已经尝试过这种方法,请看我上面的编辑。
    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