繁体   English   中英

使用条件语句的 Where 子句

[英]Where Clause Using Conditional Statement

我在下面有疑问


SELECT @RoleUser = MR.Code FROM MasterRole MR INNER JOIN MasterUsersRole MUR ON MR.Id = MUR.RoleId
    INNER JOIN MasterUsers MU ON Mu.UserCode = MUR.UserCode
    WHERE MU.UserCode = @UserLoginID


select 1 Num
            , MyHistory.ID
         , MyHistory.RequestNumber
         , MyHistory.FlowID
         , MyHistory.FlowProcessStatusID         
    from
    (
        select *
        from Requests R
        inner join
        (
            --DECLARE   @UserLoginID nvarchar(200) = 'dum.testing.3'
            select distinct
                RequestID
            from dbo.RequestTrackingHistory RTH
            where IIF(@UserLoginID = 'admin', @UserLoginID, RTH.CreatedBy) = @UserLoginID 
                OR ( CreatedBy IN 
                    SELECT Mu.UserCode from MasterUsers MU
                        INNER JOIN MasterUsersRole MUR ON MU.UserCode = MUR.UserCode
                        INNER JOIN MasterRole MR ON MUR.RoleId = MR.Id
                        WHERE MR.Code = @RoleUser
                    )

                    )
                
        )            RT on R.ID = RT.RequestID
    )                                                      as MyHistory
    inner join MasterFlow                                  F on MyHistory.FlowID = F.ID
    inner join
    (
        select FP.ID
             , FP.Name
             , FP.AssignType
             , FP.AssignTo
             , FP.IsStart
             , case FP.AssignType
                   when 'GROUP' then
                       G.Name
               end as 'AssignToName'
        from MasterFlowProcess      FP
        left join dbo.MasterRole      G on FP.AssignTo = G.ID and FP.AssignType = 'GROUP'
    )                                                      FP on MyHistory.FlowProcessID = FP.ID
    inner join MasterFlowProcessStatus                     FPS on MyHistory.FlowProcessStatusID = FPS.ID
    left join MasterFlowProcessStatusNext                  FPSN on FPS.ID = FPSN.ProcessStatusFlowID
    left join MasterFlowProcess                            FPN on FPSN.NextProcessFlowID = FPN.ID
    left JOIN MasterRole                                   MR ON MR.Id = FPN.AssignTo
    left join MasterUsersRole                              MUR on MR.Id = MUR.RoleId
    left join MasterUsers                                  MURO on MUR.UserCode = MURO.UserCode
    inner join MasterUsers                                 UC on MyHistory.CreatedBy = UC.UserCode
    left join MasterUsers                                  UU on MyHistory.UpdatedBy = UU.UserCode
    LEFT JOIN RequestMT RMT ON MyHistory.ID = RMT.RequestID  
    LEFT JOIN RequestGT RGT ON MyHistory.ID = RGT.RequestID  
    left join (SELECT sum(QtyCU) countQty , RequestId  from dbo.RequestGTDetail where IsActive = 1 group by RequestId) RGTD on RGTD.RequestId = RGT.RequestId
    left join (SELECT sum(QtyPCS) countQty , RequestId  from dbo.RequestMTDetail where IsActive = 1 group by RequestId) RMTD on RMTD.RequestId = RMT.RequestId
    left join (SELECT COUNT(IIF(returnable = 0, returnable, null)) countReturnable , RequestId  from dbo.RequestMTDetail group by RequestId) RMTR on RMTR.RequestId = RMT.RequestId
    
    left JOIN dbo.MasterDistributor md ON md.Code = RGT.CustId or md.Code = RMT.CustId
    left JOIN dbo.MasterUsersDistributor MUD ON MUD.UserCode = MURO.UserCode AND  md.Code = MUD.DistributorCode 
    LEFT JOIN dbo.MasterReason MRMT ON RMT.ReasonId = MRMT.Id 
    LEFT JOIN dbo.MasterReason MRGT ON RGT.ReasonId = MRGT.Id
    LEFT JOIN dbo.MasterDistributorGroup MDG ON MDG.Id = MD.GroupId
    OUTER APPLY dbo.FnGetHistoryApproveDate(MyHistory.Id) AS x
    where REPLACE(FPS.Name, '@Requestor', uc.Name) <> 'DRAFT'
    AND MUD.DistributorCode IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = @UserLoginID)


我想在 where 子句中添加一些逻辑

这条线

==> AND MUD.DistributorCode IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = @UserLoginID)

它取决于@RoleUser 变量,如果@RoleUser IN ('A','B') 则执行上面的where 子句,但如果@RoleUser Not IN ('A','B') where 子句未执行

我正在尝试这个 where 子句

AND IIF(@RoleUser IN ('A','B'), MUD.DistributorCode, @RoleUser) IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = IIF(@RoleUser IN ('A','B'), @UserLoginID, NULL))

它不起作用,只有在 @RoleUser IS ('A','B') 时才执行,而不是它返回 0 记录

非常感谢任何帮助或建议

谢谢你

我实现这些疯狂规则的最干净的方法是一个holderTable和一个针对 holder 表的countVariable

我将给出一个通用的例子。 这是一种“方法”和“哲学”,而不是一个具体的答案……带有复杂的 WHERE 子句。

DECLARE @customerCountryCount int

DECLARE @customerCountry TABLE ( CountryName varchar(15) )


if ( "the moon is blue on tuesday" ) /* << whatever rules you have */
BEGIN 
    INSERT INTO @customerCountry SELECT "Honduras" UNION ALL SELECT "Malaysia"
END


if ( "favorite color = green" ) /* << whatever rules you have */
BEGIN 
    INSERT INTO @customerCountry SELECT "Greenland" UNION ALL SELECT "Peru"
END



SELECT @customerCountryCount = COUNT(*) FROM @customerCountry


Select * from dbo.Customers c 
WHERE

(@customerCountryCount = 0) 
OR
( exists (select null from @customerCountry innerVariableTable where UPPER(innerVariableTable.CountryName) = UPPER(c.Country)  ))
) 

这样,而不是将所有“扭曲的逻辑”放在过于复杂的 WHERE 语句中......你有“关注点分离”......

您对@customerCountry的插入与您对@customerCountry的使用是分开的。

你有@customerCountryCount “技巧”来区分什么时候没有使用。

您也可以添加一个@customerCountryNotExists表,并将其编码到不存在的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM