1
votes

Comment exécuter les clauses 'IN' et 'WHERE' en une seule requête

J'ai une instruction de sélection SQL Server qui est censée fonctionner au cas par cas

Cas 1 : lorsque l'ID de rôle utilisateur fourni est admin, toutes les données seront sélectionnées

Cas 2 : En dehors du rôle d'administrateur du formulaire, la sélection retournera toutes les données à l'exception des données d'administration.

DECLARE @UserRoleID INT = 3
SELECT urp.id AS 'iD'
    ,canview AS 'read'
    ,cancreate AS 'create'
    ,canedit AS 'update'
    ,candelete AS 'delete'
    ,ur.description AS 'userRole'
    ,ch.description AS 'rightsToMenu'
    ,urp.creator AS 'creator'
    ,urp.datecreated AS 'dateCreated'
    ,urp.datemodified AS 'dateModified'
    ,urp.modifier AS 'modifier'
FROM userrolepermission urp
INNER JOIN userrole ur ON urp.userroleid = ur.id
INNER JOIN channel AS ch ON urp.channelid = ch.id
WHERE urp.UserRoleID IN (
        (
            CASE 
                WHEN @UserRoleID = 1
                    THEN ('2')
                ELSE CAST(@UserRoleID AS NVARCHAR)
                END
            -- tried this also
            WHERE (
                    CASE 
                        WHEN urp.userroleid = @UserRoleID
                            AND @UserRoleID > 1
                            THEN @UserRoleID
                        ELSE @UserRoleID
                        END IN (
                        SELECT ID
                        FROM UserRole(NOLOCK)
                        )
                    )
            )
        )

Ici, la condition renvoie toutes les données qui ne sont pas souhaitées.

Example:

@UserRoleID = 1 - Récupérez ensuite toutes les données et Si @UserRoleID! = 1 Ensuite, récupérez une correspondance spécifique enregistrements.


0 commentaires

5 Réponses :


0
votes

Vous pouvez essayer comme ci-dessous

WHERE (
        isnull(@UserRoleID, 0) = 1
        OR (
            isnull(@UserRoleID, 0) <> 1
            AND dbo.TableName.UserRole = @UserRoleID
            )
        )


0 commentaires

1
votes

Vous pouvez utiliser la logique booléenne à la place:

where (@UserRoleID = 1) OR
      (@UserRoleID <> 1 AND UserRole = @UserRoleID);


0 commentaires

0
votes

Vous pouvez opter pour la logique IF ELSE. Même s'il a l'air plus long, il a l'air plus propre.

DECLARE @UserRoleID INT =3

IF @UserRoleID = 1 -- admin
BEGIN

   SELECT    
                          urp.id             AS 'iD',   
                          canview            AS 'read',   
                          cancreate          AS 'create',   
                          canedit            AS 'update',   
                          candelete          AS 'delete',   
                          ur.description     AS 'userRole',   
                          ch.description     AS 'rightsToMenu',   
                          urp.creator        AS 'creator',   
                          urp.datecreated    AS 'dateCreated',   
                          urp.datemodified   AS 'dateModified',   
                          urp.modifier       AS 'modifier'   
               FROM       userrolepermission AS urp   
               INNER JOIN userrole           AS ur   
               ON         urp.userroleid = ur.id   
               INNER JOIN channel AS ch   
               ON         urp.channelid = ch.id 
END
ELSE
BEGIN

     SELECT    
                          urp.id             AS 'iD',   
                          canview            AS 'read',   
                          cancreate          AS 'create',   
                          canedit            AS 'update',   
                          candelete          AS 'delete',   
                          ur.description     AS 'userRole',   
                          ch.description     AS 'rightsToMenu',   
                          urp.creator        AS 'creator',   
                          urp.datecreated    AS 'dateCreated',   
                          urp.datemodified   AS 'dateModified',   
                          urp.modifier       AS 'modifier'   
               FROM       userrolepermission AS urp   
               INNER JOIN userrole           AS ur   
               ON         urp.userroleid = ur.id   
               INNER JOIN channel AS ch   
               ON         urp.channelid = ch.id 
           WHERE urp.UserRoleID = @UserRoleID 

END     


1 commentaires

Merci mec, peut aller avec cela aussi, mais pas souhaité dans mon cas.



0
votes

a utilisé ce code ...

 WHERE urp.UserRoleID IN((CASE WHEN @UserRoleID = 1 THEN ('2') ELSE CAST(@UserRoleID AS NVARCHAR) END))

UserRoleID = 3 record obtenir ce code utilement


0 commentaires

2
votes

Vous pouvez simplement utiliser Dynamic SQL.

DECLARE @query NVARCHAR(MAX)
  SET @query='SELECT urp.id AS [iD]
,canview AS [read]
,cancreate AS [create]
,canedit AS [update]
,candelete AS [delete]
,ur.description AS [userRole]
,ch.description AS [rightsToMenu]
,urp.creator AS [creator]
,urp.datecreated AS [dateCreated]
,urp.datemodified AS [dateModified]
,urp.modifier AS [modifier]
     FROM userrolepermission urp
     INNER JOIN userrole ur ON urp.userroleid = ur.id
   INNER JOIN channel AS ch ON urp.channelid = ch.id '


       IF @UserRoleID=1
    BEGIN

      SET @query += ' your condition'
       END 
     ELSE 

     BEGIN 

     SET @query += ' your condition'
     end


   EXECUTE @query 


0 commentaires