2017-02-07 3 views
1
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 

In der oben gespeicherte Prozedur zu schreiben, wenn @Getactiveonly wahr ist, dann sollte es nehmen nur die Benutzer, die sonst aktiv sind es sowohl aktive als auch inaktive Benutzer nehmen soll. d.h IF (@GetactiveOnly = 1) dann wird es den Benutzern holen, deren Isactive 1 nur sonst es alle Benutzer IsActive deren holt 0 und 1.Alternative Methode der Methode Wenn in der gespeicherten Prozedur

dies auf einfachere Art und Weise geschrieben werden können, um Doppel select-Anweisungen zu vermeiden?

+0

Da @Peter ja geantwortet hatte, ist es möglich. Ich rate Ihnen nur, die Abfragepläne für beide Versionen zu überprüfen. Manchmal kann OR zu Problemen führen. – Serg

Antwort

2

Sie können etwas mehr Boolesche Logik anwenden, auf diese einheitliche Abfrage führt:

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

In Worten:

  • Für 0, der erste Teil TRUE ist, der zweite Teil irrelevant machen.
  • Für 1 ist der erste Teil FALSE und dann bestimmt der zweite Teil das Ergebnis.
Verwandte Themen