在存储过程中编写 If 方法的替代方法

Alternate method to write the If method in the stored procedure

ALTER PROCEDURE [User].GetUserByEmail
    @Email VARCHAR(200),
    @GetActiveOnly BIT
AS
BEGIN
    IF (@GetActiveOnly = 1)
    BEGIN
        SELECT  
            portalUser.PortalUserId AS 'UserId',
            organisation.OrganisationId AS 'OrganisationId',
            organisation.LookUpOrganisationTypeId AS 'OrganisationTypeId'
        FROM    
            Admin.PortalUser portalUser
        INNER JOIN 
            Admin.LookUpPortalUserRole userRole ON userRole.LookUpPortalUserRoleId = portalUser.LookUpPortalUserRoleId
        INNER JOIN 
            Admin.Organisation organisation ON organisation.OrganisationId = portalUser.OrganisationId
        WHERE   
            portalUser.Email = @Email
            AND portalUser.IsActive = 1
    END
    ELSE
    BEGIN
        SELECT  
            portalUser.PortalUserId AS 'UserId',
            organisation.OrganisationId AS 'OrganisationId',
            organisation.LookUpOrganisationTypeId AS 'OrganisationTypeId'
        FROM    
            Admin.PortalUser portalUser
        INNER JOIN 
            Admin.LookUpPortalUserRole userRole ON userRole.LookUpPortalUserRoleId = portalUser.LookUpPortalUserRoleId
        INNER JOIN 
            Admin.Organisation organisation ON organisation.OrganisationId = portalUser.OrganisationId
        WHERE   
            portalUser.Email = @Email 
    END
END

在上面的存储过程中,当 @Getactiveonly 为真时,它应该只接受活动用户,否则它应该同时接受活动用户和非活动用户。即 IF (@GetactiveOnly = 1) 然后它将获取 Isactive 为 1 的用户,否则它会获取所有 IsActive 为 0 的用户以及 1。

是否可以用更简单的方式来避免重复 select 语句?

您可以应用更多的布尔逻辑,从而生成此统一查询:

SELECT ...
WHERE portalUser.Email = @Email
AND (@GetActiveOnly = 0 OR portalUser.IsActive = 1)

文字:

  • 对于 0,第一部分为真,使第二部分无关紧要。
  • 对于 1,第一部分为 FALSE,然后第二部分决定结果。