2013-04-23 28 views
0

我有以下情形:PL/SQL:有條件的地方

CREATE OR REPLACE PROCEDURE GETINBOX 
(
    inHasAttachments  IN int 
) 
AS 

BEGIN 

    SELECT M.MailId, 
      M.SenderId, 
      E.Emp_Name As "Sender", 
      MI.RecipientId, 
      M.Subject 

    FROM MAIL M INNER JOIN MAILINBOX MI ON M.MailId = MI.MailId 


    WHERE MI.RecipientId = '547' AND 
      M.NotificationSelected = 'Y' 

    IF inHasAttachments = '1' THEN 
     AND M.Attachments = 'Y' 
    END IF; 


END GETINBOX; 

是否可以根據參數的值條件添加到where子句?

WHERE MI.RecipientId = '547' AND 
      M.NotificationSelected = 'Y' 

    IF inHasAttachments = '1' THEN 
     AND M.Attachments = 'Y' 
    END IF; 

顯然這是不被允許的,但是有可能在PL/SQL中以某種方式做到這一點? 我知道一種方法是複製查詢並根據參數的值執行不同的查詢,但我不想複製我的代碼。

+0

如果WHERE子句是唯一的區別,那麼爲什麼不'UNION ALL' – tyh 2013-04-23 19:32:38

+0

爲什麼大家在這種情況下是指由工會嗎? – 2013-04-23 19:33:42

+0

啊對不起,我錯誤地解釋了參數的使用部分... – tyh 2013-04-23 19:37:43

回答

3

正如我理解您的需求:如果參數inHasAttachments的值是1那麼你要通過M.Attachments = 'Y'進一步篩選,如果其值不1,那麼你不關心M.Attachments。這是除了條件MI.RecipientId = '547' AND M.NotificationSelected = 'Y'之外。

你可以這樣說:

SELECT M.MailId, 
    M.SenderId, 
    E.Emp_Name As "Sender", 
    MI.RecipientId, 
    M.Subject 
FROM MAIL M INNER JOIN MAILINBOX MI ON M.MailId = MI.MailId 
WHERE MI.RecipientId = '547' AND M.NotificationSelected = 'Y' 
    AND (inHasAttachments <> '1' OR M.Attachments = 'Y') 
+0

這是一個有趣的解決方案,但我忘了提及的一件事是,我還想添加另一個「INNER JOIN」語句,具體取決於某些條件:IF(PARAMETER_VALUE ='Y')那麼內部加入MAILATATACH MA安MA.MailId = M.MailId,這是否可能? – 2013-04-23 20:02:00

+1

您是否僅僅爲了篩選出更多的行(那些不在'MailAttachments'中的行),或者您正在加入,因爲您想從「MailAttachments」中選擇列?如果它是第一個,那麼它可能是可行的,但它會開始變得越來越像黑客。如果它是第二個(甚至可能是第一個),那麼你可能需要考慮將查詢建立爲一個字符串並使用PL/SQL的'EXECUTE IMMEDIATE'。 – 2013-04-23 20:20:17

+0

謝謝埃德吉布斯,建立一個查詢作爲一個字符串,然後使用EXECUTE IMMEDIATE是一個好主意,它符合我的需要,考慮到我有太多的條件。 – 2013-04-23 20:31:10