2015-03-03 183 views
1

我们有一个表格测试,其中status_cd作为列之一。状态代码可以具有三个值 - 预先,批准和确认。SQL中的设置优先级

我必须以这样的方式编写查询,它应该获取确认状态cd的记录。如果确定状态cd不存在,则取为批准,如果获得批准是不存在的,取了初试,如果初试也不存在,获取在上面的例子空

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

,查询应返回批准RULE_ID = 1

+0

还有,你试过这么远吗? – 2015-03-03 09:53:05

+0

现在我正在用java代码处理它,即,我正在获取规则ID的所有记录并将其存储在列表中,并使用谓词将其筛选出来。 – Sunny 2015-03-03 09:56:07

+0

如果您需要status_cd值,那么请转到另一个具有status_cd名称的表。在这里,不是给予0-nul,1-approved-2为预备。然后使用where子句为rule_id调用max。 – Iftikhar 2015-03-03 09:58:10

回答

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

0

使用值'3已确认','2已批准','1预定'和'0空',或者只是在数字字段中使用默认值零,并将值设置为1,2,3规则进展(执行速度更快,但如果保留字符串实现,则通过在字段中使用'0 Null'的默认值避免null两种方式)。

然后与此查询获取记录:

SELECT status_cd FROM YourTableName WHERE RULE_ID = 1个ORDER BY status_cd DESC;

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

SELECT TOP 1 status_cd FROM ...(其余是一样的)