SQL优先级查询

时间:2008-12-08 15:39:42

标签: sql operator-precedence

我有一个有三列的记录表。一列是唯一标识符,一列称为“名称”,另一列称为“状态” “名称”列中的值可以重复,以便您可以在多行中看到名称“Joe”。名称“Joe”可能有一行状态为“open”,另一行状态为“closed”,另一行为“waiting”,另一行为“hold”。我想,在这个从最高到最低的顺序使用定义的优先级:(“关闭”,“保持”,“等待”和“打开”)拉出每个名称的最高排名行并忽略其他名称。有人知道一个简单的方法吗?

顺便说一下,并非每个名字都有所有状态表示,因此“Joe”可能只有一行“等待”和“保持”,或者只是“等待”。

3 个答案:

答案 0 :(得分:4)

我会创建一个名为“Status_Precedence”的第二个表,其行如:

Status  | Order
---------------
Closed  |  1
Hold    |  2
Waiting |  3
Open    |  4

在您对另一个表的查询中,请加入此表(在Status_Precedence.Status上),然后您可以ORDER BY Status_Precedence.Order

答案 1 :(得分:4)

如果您不想创建另一个表,可以使用SELECT CASE

指定数字优先级
Select Name, Status, Case Status 
        When 'Closed' then 1
        When 'Hold' then 2
        When 'Waiting' then 3
        When 'Open' Then 4
        END
         as StatusID

         From Logging
Order By StatusId -- Order based on Case

查找表也是一个很好的解决方案。

答案 2 :(得分:0)

我最终使用了matt b的解决方案,并使用这个最终查询来筛选排名较低的排名(较低的排名较高的数字)。

SELECT * from [TABLE] tb
LEFT JOIN Status_Precedence sp ON tb.Status = sp.Status
WHERE  sp.Rank = (SELECT MIN(sp2.rank)
                FROM[Table] tb2
           LEFT JOIN Status_Precedence sp2 ON tb2.Status = sp2.Status
                WHERE tb.Status = tb2.Status)
order by tb.[name]