2014-09-18 47 views
1

我想正确的错误与现有的应用程序(我没有源,这应该真的在UI中处理)。它的要点必须是排序方式有多个CASE语句

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

2)如果供应商类型与“新%”它永远是下并行线

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 

回答

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%值排序到顶部,其他所有值排在最后。

+0

感谢感激 – 2014-09-18 21:02:52

2

你只需要为这一个CASE表达:

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