【问题标题】:SQL Server WHERE Clause using Temporary Columns使用临时列的 SQL Server WHERE 子句
【发布时间】:2010-12-25 21:52:50
【问题描述】:

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

非常感谢!

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;

【问题讨论】:

  • 你可以使用子选择吗?

标签: sql sql-server tsql calculated-columns


【解决方案1】:

使用

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

【讨论】:

  • 谢谢!我没有意识到解决方案实际上非常简单。估计是我想的不够仔细。 =p
  • +1。即使逻辑相同,我更喜欢你的 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)

【讨论】:

    【解决方案3】:

    您可以使用COALESCE 代替 CASE,因为您正在检查 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
    

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多