在SQL中设置优先级

时间:2015-03-03 09:52:09

标签: mysql sql database

我们有一个表测试,其中我们将status_cd作为列之一。状态代码可以有三个值 - Prelim,Approved和confirm。

我必须以这样的方式编写查询:它应该获取已确认状态cd的记录。如果确认状态cd不存在,则获取Approved,如果获得批准,则获取prelim,如果prelim也不存在,则获取null

id   rule_id   status_cd
1     1         prelim
2     1         null
3     1         approved

在上面的示例中,查询应该返回已批准的rule_id = 1

2 个答案:

答案 0 :(得分:1)

尝试这种方式:

SELECT T1.*
FROM test T1 JOIN
(SELECT *,CASE status_cd WHEN 'confirmed' THEN 1 
                         WHEN 'approved' THEN 2 
                         WHEN 'prelim' THEN 3 
                         ELSE 4 END AS Rank
 FROM test) T2 ON T1.id=T2.id AND T1.Rule_id =T2.Rule_id
ORDER BY T2.Rank
LIMIT 1

结果:

ID  RULE_ID  STATUS_CD
3   1        approved

SQL Fiddle中的示例结果。

答案 1 :(得分:0)

使用值' 3已确认' 2批准'' 1 Prelim'并且' 0 Null' 0或者只是在数字字段中使用默认值零,并在规则进行时将值设置为1,2,3(执行速度要快得多,但使用默认值' 0 Null&#避免使用null 39;在字段中,如果你保持字符串实现)。

然后使用此查询获取记录:

SELECT status_cd FROM YourTableName WHERE rule_id = 1 ORDER BY status_cd DESC;

查询的第一行将始终包含您想要的答案。此外,如果您还要查看这些行,其他行将在那里确认所有其他步骤都存在等。如果您知道只需要一行,那么使用

SELECT TOP 1 status_cd FROM ...(其余部分相同)