我們有一個表格測試,其中status_cd作爲列之一。狀態代碼可以具有三個值 - 預先,批准和確認。SQL中的設置優先級
我必須以這樣的方式編寫查詢,它應該獲取確認狀態cd的記錄。如果確定狀態cd不存在,則取爲批准,如果獲得批准是不存在的,取了初試,如果初試也不存在,獲取在上面的例子空
id rule_id status_cd
1 1 prelim
2 1 null
3 1 approved
,查詢應返回批准RULE_ID = 1
我們有一個表格測試,其中status_cd作爲列之一。狀態代碼可以具有三個值 - 預先,批准和確認。SQL中的設置優先級
我必須以這樣的方式編寫查詢,它應該獲取確認狀態cd的記錄。如果確定狀態cd不存在,則取爲批准,如果獲得批准是不存在的,取了初試,如果初試也不存在,獲取在上面的例子空
id rule_id status_cd
1 1 prelim
2 1 null
3 1 approved
,查詢應返回批准RULE_ID = 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。
使用值'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 ...(其餘是一樣的)
還有,你試過這麼遠嗎? – 2015-03-03 09:53:05
現在我正在用java代碼處理它,即,我正在獲取規則ID的所有記錄並將其存儲在列表中,並使用謂詞將其篩選出來。 – Sunny 2015-03-03 09:56:07
如果您需要status_cd值,那麼請轉到另一個具有status_cd名稱的表。在這裏,不是給予0-nul,1-approved-2爲預備。然後使用where子句爲rule_id調用max。 – Iftikhar 2015-03-03 09:58:10