使用多个CASE语句排序

时间:2014-09-18 20:27:30

标签: sql-server tsql

我正在尝试更正现有应用程序的错误(我没有源代码,这应该在UI中处理)。它的要点必须是

1)如果OrderLineItem fk_OrderId = 888888888它始终是第一行。

2)如果供应商类型以' NEW%'开头。它始终是下一个并发行

3)订单后面的任何其他内容都无关紧要

我正在玩这个,不过我对语法的工作方式有点困惑:

SELECT 
   [Columns]
FROM [dbo].[OrderLineItem] o
LEFT OUTER JOIN [OPUS2].dbo.Vendor v ON o.fk_VendorID = v.ID
WHERE fk_OrderID = @fk_OrderID OR fk_OrderID = 888888888
 ORDER BY 
 CASE WHEN o.ID = 888888888 THEN 1 END ASC,
 CASE WHEN v.[Type] Like 'NEW%' THEN 2 ELSE 3 END  

2 个答案:

答案 0 :(得分:2)

您只需要一个CASE表达式:

ORDER BY 
   CASE WHEN o.ID = 888888888 
          THEN 1
        WHEN v.[Type] LIKE 'NEW%' 
          THEN 2
        ELSE 3 
   END  

答案 1 :(得分:1)

这应该有效:

SELECT 
   [Columns]
FROM [dbo].[OrderLineItem] o
LEFT OUTER JOIN [OPUS2].dbo.Vendor v ON o.fk_VendorID = v.ID
WHERE fk_OrderID = @fk_OrderID OR fk_OrderID = 888888888
 ORDER BY 
 CASE WHEN o.ID = 888888888 THEN 1 ELSE 2 END ASC,
 CASE WHEN v.[Type] Like 'NEW%' THEN 1 ELSE 2 END ASC

这会对您的结果施加两个排序顺序。第一个将强制888888888值到顶部,其他所有内容都未分类。第二种排序将在外部排序(888888888和非888888888)中的每个不同值内,将NEW%值排序到顶部,将其他所有值排序到底部。