2015-10-16 73 views
0

我想這個查詢返回只有一行。我在CASE語句的子句中按照它們最有可能發生的順序放在那裏,所以最可能的TRUE語句將始終首先評估。但是,似乎每個WHEN語句在查詢結束之前都要進行評估,儘管它找到了多個TRUE語句。WHERE CASE返回多個行

SELECT To_Char(T.PRFINISH, 'DD/MM/YY') FINISH, 
     T.PRNAME 
FROM PRTASK T 
     LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID 
WHERE T.PRNAME = CASE 
        WHEN (T.PRNAME = 'Concept Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept Tech PEP Meeting Date' 
        WHEN (T.PRNAME = 'Concept BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept BRU Meeting Date' 
        WHEN (T.PRNAME = 'End of Concept Phase' AND T.PRSTATUS != 2) THEN 'End of Concept Phase'                             
        WHEN (T.PRNAME = 'Evaluate Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate Tech PEP Meeting Date' 
        WHEN (T.PRNAME = 'Evaluate BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate BRU Meeting Date' 
        WHEN (T.PRNAME = 'Evaluate TSC Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate TSC Meeting Date' 
        WHEN (T.PRNAME = 'End of Evaluate Phase' AND T.PRSTATUS != 2) THEN 'End of Evaluate Phase'      
        WHEN (T.PRNAME = 'End of Analyse Phase' AND T.PRSTATUS != 2) THEN 'End of Analyse Phase' 
        WHEN (T.PRNAME = 'End of Design Phase' AND T.PRSTATUS != 2) THEN 'End of Design Phase' 
        WHEN (T.PRNAME = 'End of Build Phase' AND T.PRSTATUS != 2) THEN 'End of Build Phase' 
        WHEN (T.PRNAME = 'End of Test Phase' AND T.PRSTATUS != 2) THEN 'End of Test Phase' 
        WHEN (T.PRNAME = 'In Service' AND T.PRSTATUS != 2) THEN 'In Service'      
        WHEN (T.PRNAME = 'End of Implement Phase' AND T.PRSTATUS != 2) THEN 'End of Implement Phase' 
        WHEN (T.PRNAME = 'End of Closure Phase' AND T.PRSTATUS != 2) THEN 'End of Closure Phase' 
        ELSE 'In Service' 
       END 
      AND INV_INVESTMENTS.CODE = '007058' 

即使第一個WHEN子句爲真,這也會返回多行。我認爲CASE報表在他們發現TRUE語句時完成了。

編輯:也許我不解釋這口井,讓我們試試這個:

在INV_INVESTMENTS表中的每個ID是一個項目。每個項目在PRTASK表中都有一組任務。在這種PRTASK表,我們將有工作的(PRNAME)的名稱,狀態(PRSTATUS)和完成日期(PRFINISH)。任務列表,在它們出現在一個項目的順序是:

1.概念科技PEP會議日期
2.概念BRU會議日期
3.概念的結束階段
4.評估技術PEP會議日期
5. Evalute BRU會議日期
6. EV aluate TSC會議日期

其餘的任務都按我在CASE聲明中列出的順序排列。我想這個查詢返回,是完成日期在列表中的第一個任務爲0或1

+1

的'CASE'是爲表(或多個)每行評估。所有符合'WHERE'條件的行都包含在結果集中。你錯誤地使用'CASE'陳述。對於每一行有PRSTATUS!= 2 [和其中包含的PNAME,看起來都是它們] OR PRNAME ='In Service'AND INV_INVESTMENTS.CODE ='007058','WHERE'子句將評估爲TRUE,並返回該行。也許如果您提供了示例輸入數據和預期結果,我可以嘗試編寫查詢。 – Turophile

+0

@Turophile,我想只返回T.PRNAMEs之一的完成日期。雖然多個可以是真實的,但一次只有一個是相關的(並且與列出的順序相關,即Concept Concept PEP會議日期的PRSTATUS爲2,在數據庫中意味着已完成,Concept BRU會議日期就成爲我想要查找的內容)。我一直在試圖找出邏輯寫這個最好的方法。我的邏輯是,如果他們按照出現的順序,那麼我總是會找到下一個最相關的PRNAME。我想不是這種情況。 –

+0

PRSTATUS是什麼? –

回答

1

一個PRSTATUS試試這個。您可以將已知名稱放入表中,然後在連接中使用它。這將簡化您的選擇以下幾點:

SELECT TOP 1 To_Char(T.PRFINISH, 'DD/MM/YY') FINISH, 
     T.PRNAME 
FROM PRTASK T 
     LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID 
     JOIN ( 
     SELECT 'Concept Tech PEP Meeting Date' as Name, 1 as [Order] 
     UNION All 
     SELECT '<your next PRNAME here', 2 as [Order] 
     UNION ALL ... 
    ) names on names.Name = T.PRNAME 
where PRSTATUS IN (0,1) AND PRINV_INVESTMENTS.CODE = '007058' 
ORDER BY names.Order 
+0

對不起,我應該提到,我只有讀訪問數據庫我試圖查詢這些信息,所以我不能創建表。 –

+0

你可以把你熟知的名字放到上面的內部select語句中 –

+0

花了我一秒鐘的時間才意識到我需要從DUAL(Oracle)中選擇SELECT,但除此之外它的工作原理是完美的。感謝隊友,我甚至沒有想到這一點。我很困惑CASE,我沒有考慮另一種選擇。 –

0

我還是不明白你正在嘗試做的(未給出樣本數據/結果),但我會重組這樣的:

SELECT To_Char(PRFINISH, 'DD/MM/YY') AS FINISH, PRNAME 
FROM ( 
    SELECT MAX(PRFINISH), 
     PRNAME 
    FROM PRTASK AS T 
    WHERE (PRNAME = 'In Service' OR PRSTATUS != 2) 
    AND PRPROJECTID IN 
    (SELECT ID 
    FROM INV_INVESTMENTS 
    WHERE CODE = '007058') 
    GROUP BY PRNAME 
) AS TABLE1 

注意,這是假設您在查詢中列出的PRNAME所有可能的值。