我们有一个表测试,其中我们将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
答案 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 ...(其余部分相同)