2009-12-12 106 views
2

我有以下查询,它使用CASE语句。 无论如何要添加到where子句WHERE IsBusinessDayFinal = 0?不使用临时表?SQL Server WHERE子句使用临时列

非常感谢!

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

您可以使用子查询? – 2009-12-12 02:43:27

回答

3

使用

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

谢谢!我没有意识到解决方案其实很简单。我想我没觉得够辛苦。 = p – Abe 2009-12-12 02:59:39

+0

+1。即使逻辑是相同的,我更喜欢你的IS NULL版本! – 2009-12-12 04:10:15

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

可以使用COALESCE代替CASE,因为你检查空:

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