2016-04-26 64 views
2

這是我的存儲過程,到目前爲止SQL存儲過程修改與IF-ELSE

ALTER PROC [dbo].[getItems] 
    (
    @EventId int, 
    @OrgUserId int 
) AS 

BEGIN 

DECLARE @BoardBookId int; 
SET @BoardBookId = (SELECT bb.BoardbookId FROM Boardbook bb WHERE bb.ItemId = @EventId); 

WITH PermissionDeniedAttachments AS 
(
    SELECT bbi.CategoryItemId 
    FROM BoardbookItem bbi 
    INNER JOIN CategoryItem ci ON ci.CategoryItemId = bbi.CategoryItemId 
    WHERE bbi.BoardbookId = @BoardBookId AND bbi.CategoryItemId > 0 AND ci.catID NOT IN (SELECT catID from dbo.f_Categories(@OrgUserId)) 
) 
SELECT 
    bbi.BoardbookId, 
    bbi.BoardbookItemId, 
    bbi.CategoryItemId, 
    bbi.ChBy, 
    bbi.ChDt, 
    bbi.CrBy, 
    bbi.CrDt, 
    bbi.DeletedBy, 
    bbi.DeletedDt, 
    bbi.Description, 
    bbi.Duration, 
    bbi.ParentBoardbookItemId, 
    bbi.SortOrder, 
    bbi.Title, 
    bbi.Resolutions, 
    bbi.Presenter, 
    bbi.BoardbookItemType, 
    u1.Name_FirstLast as [ItemCreatedByName], 
    u2.Name_FirstLast as [ItemChangedByName], 
    CAST(CASE WHEN ci.deletedDt IS NULL THEN 0 
         ELSE 1 END AS BIT) AS Deleted, 
    i.itemType as [DocType], 
    ISNULL(ci.catID, 0) AS CatId, 
    ISNULL(ci.itemID, 0) AS ItemId, 
    d.docID as docId, 
    d.docPages as DocPages, 
    d.docPwdProtected AS HasPassword, 
    bbi.BoardbookItemTypeCustom 
from BoardbookItem bbi 
LEFT JOIN Users u1 on u1.UserName=bbi.CrBy 
LEFT JOIN Users u2 on u2.UserName=bbi.ChBy 
LEFT OUTER JOIN CategoryItem ci ON bbi.CategoryItemId IS NOT NULL AND bbi.CategoryItemId = ci.CategoryItemId 
LEFT JOIN Item i ON ci.itemID = i.itemID 
LEFT JOIN Documents d on d.docID = bbi.DocId 
      where [email protected] AND bbi.DeletedDt IS NULL AND 
     (bbi.CategoryItemId IS NULL OR bbi.CategoryItemId NOT IN (Select CategoryItemId from PermissionDeniedAttachments)) 

現在,我要的是把一個var @submenuitem bit並測試它... 所以,如果@submenuitem = 0我會爲響應我現在得到的效果是相同的, ,但是如果@submenuitem = 1我想在前面的「where」中再加一個檢查。 'AND bbi.ParentBoardbookItemId='0'

看來,有可能與IF ELSE語句完成,但不幸的是我不能做正確的方式

預先感謝您!

+0

哪個RDBMS是這個呢?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

1

我會建議做這個簡單的改變你WHERE條款:

LEFT JOIN Documents d on d.docID = bbi.DocId 
     where [email protected] AND bbi.DeletedDt IS NULL AND 
    (bbi.CategoryItemId IS NULL OR bbi.CategoryItemId NOT IN (Select CategoryItemId from PermissionDeniedAttachments) 
     AND (@submenuitem = 0 OR bbi.ParentBoardbookItemId='0') 
6

沒有if... else聲明是絕對有可能的。

只需添加這where條件

AND ((bbi.ParentBoardbookItemId='0' and @submenuitem = 1) or @submenuitem = 0) 

正如你所描述它會工作。

+0

謝謝!它看起來很簡單,我沒有得到erros。我現在要從客戶端測試它(前端) – George

+0

這種情況過於複雜。它可以簡單地是'AND(@submenuitem = 0或bbi.ParentBoardbookItemId ='0')' –

+0

@GeorgiosDeliandreadis如果性能是一個問題,測試。我發現ORs增加了大量的竊聽。解決方法是使用UNION並複製查詢,頂部是OR的一側,底部是OR的第二側。 – UnhandledExcepSean