2013-09-25 8 views
0

Je suis en train de faire quelque chose comme ceci:conditionnelle select dans l'instruction SQL

SELECT UserID from Users as user 
    INNER JOIN UserStatus as userStatus on u.UserID = us.UserID 
WHERE 
    --user.IsActive = 1 
    --if user.IsActive = 0 
     --userStatus.DeactivatedDate > @StartDate 
     --userStatus.DeactivatedDate < @EndDate 

Donc, en général, je veux une requête qui me reçoit tous les résultats dont la valeur correspond à la clause WHERE sans ignorer nécessairement tous les résultats Qui ne. Un peu comme un diagramme de Venn avec le côté gauche du cercle et le milieu rempli. Pour l'exemple que j'ai montré, je veux tous les utilisateurs qui sont actuellement actifs et les utilisateurs qui ne sont pas actifs mais actifs dans le temps imparti frame (si je voulais que le nombre total d'utilisateurs actifs à un moment quelconque dans un mois, par exemple).

J'ai essayé de faire des choses comme

SELECT UserID from Users as user 
    INNER JOIN UserStatus as userStatus on u.UserID = us.UserID 
WHERE 
    Case user.IsActive = 1 

Mais qui est évidemment une syntaxe incorrecte. Je devrai également traduire cela en LINQ, donc des ressources à ce sujet seraient également bénéfiques.

Répondre

3
SELECT UserID from Users as user 
    INNER JOIN UserStatus as userStatus on u.UserID = us.UserID 
WHERE 
    user.IsActive = 1 OR us.DeactvatedDate BETWEEN '2012-08-13' AND '2013-08-13' 

Cela fera le travail si vous avez une entrée au sujet date à laquelle un utilisateur a obtenu decativated.

Dans LINQ

var UID= from u in Users 
     from s in UserStatus 
     where u.UserID == s.UserID || (s.DeactivatedDate >= @StartDate &&   
     s.DeactivatedDate <= @endDate) 
     select u.userID  
+3

Hehe @ 'decavitated', tout cela signifie, il semble mortel;) – Khan

+1

désolé pour faute de frappe! –

+2

+1 pour inclure LINQ – Khan

4

Je crois que cela vous donnera le résultat que vous recherchez:

SELECT UserID 
FROM Users U 
JOIN UserStatus US 
    ON U.UserID = US.UserID 
WHERE 
     U.IsActive = 1 
     OR (
       U.IsActive = 0 
      AND US.DeactivatedDate > @StartDate 
      AND US.DeactivatedDate < @EndDate 
     )