2015-03-03 178 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 ...(其餘是一樣的)