2016-04-26 100 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