2009-12-12 2 views
2

J'ai la requête suivante, qui utilise une instruction CASE. Existe-t-il un ajout à la clause where WHERE IsBusinessDayFinal = 0? sans utiliser une table temporaire?Clause WHERE SQL Server utilisant des colonnes temporaires

merci beaucoup!

SELECT 
     ac.DateTimeValue, 
     CASE 
      WHEN pc.IsBusinessDay IS NOT NULL THEN pc.IsBusinessDay 
      ELSE ac.IsBusinessDay 
     END AS IsBusinessDayFinal, 
     ac.FullYear, 
     ac.MonthValue, 
     ac.DayOfMonth, 
     ac.DayOfWeek, 
     ac.Week 
    FROM 
     [dbo].[AdminCalendar] ac LEFT JOIN 
     [dbo].ProjectCalendar pc ON ac.DateTimeValue = pc.DateTimeValue AND pc.ProjectId = @projectId 
    WHERE ac.DateTimeValue >= @startDate AND ac.DateTimeValue <= @finishDate; 
+1

pourrait vous d'utiliser un sous-sélection? –

Répondre

3

Utilisez

WHERE (pc.IsBusinessDay IS NULL AND ac.IsBusinessDay = 0) 
OR pc.IsBusinessDay = 0 
+0

Merci! Je n'avais pas réalisé que la solution était vraiment simple. Je suppose que je n'ai pas assez réfléchi. = p – Abe

+0

+1. Même si la logique est identique, je préfère votre version IS NULL! –

2
WHERE ac.DateTimeValue >= @startDate AND ac.DateTimeValue <= @finishDate 
     AND ((pc.IsBusinessDay IS NOT NULL AND pc.IsBusinessDay = 0) OR ac.IsBusinessDay = 0) 
2

Vous pouvez utiliser COALESCE au lieu de CASE parce que vous vérifiez pour null:

SELECT ac.DateTimeValue, 
     COALESCE(pc.IsBusinessDay, ac.IsBusinessDay) AS IsBusinessDayFinal, 
     ac.FullYear, 
     ac.MonthValue, 
     ac.DayOfMonth, 
     ac.DayOfWeek, 
     ac.Week 
    FROM [dbo].[AdminCalendar] ac 
LEFT JOIN [dbo].ProjectCalendar pc ON ac.DateTimeValue = pc.DateTimeValue 
            AND pc.ProjectId = @projectId 
WHERE ac.DateTimeValue >= @startDate 
AND ac.DateTimeValue <= @finishDate 
AND COALESCE(pc.IsBusinessDay, ac.IsBusinessDay) = 0