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