Sql server 2008 SQL Server:在case语句中使用可能为NULL的元素

Sql server 2008 SQL Server:在case语句中使用可能为NULL的元素,sql-server-2008,Sql Server 2008,好的,我有一个关于在case语句中使用可能为null的列的问题 同样,我有两个表,第一个看起来像这样的UserActivity: userID Action Time 1 25 12:00 1 10 12:01 1 12 12:35 1 6 13:54 2 10 6:47 2

好的,我有一个关于在case语句中使用可能为null的列的问题

同样,我有两个表,第一个看起来像这样的
UserActivity

   userID    Action    Time
     1         25       12:00
     1         10       12:01
     1         12       12:35
     1          6       13:54
     2         10        6:47
     2         42        6:48
     3          8       11:54
     etc.
但是第二个现在看起来像是
UserSchedule

   userID      startTime1        stopTime1     startTime2    stoptime2  startTime3    stopTime3
     1            07:00            09:00         11:00         12:00       14:30         16:30
     2            11:00            12:30         14:00         15:30       
     3            14:00            15:00
    etc.
因此,我需要能够评估与所有这些开始和停止时间相关的动作发生的时间。有些用户一天最多有5次启动/停止时间。有些人只有一个

这段代码是@Adam Wengler给我的,用来解决之前的一个问题,如果只有一个启动和停止时间,它会非常有效。我不确定如何包含针对5个潜在开始/停止列中的每一列进行测试的逻辑,如果它们为空,则忽略它们

  UPDATE ua
  SET ua.TimeStatusId = CASE
                    WHEN ua.Time >= us.Schedule_Start
                       AND ua.Time <= us.Schedule_stop THEN 1
                    WHEN ua.Time >= DATEADD(HOUR, -1, us.Schedule_Start)
                       AND ua.Time <= us.ScheduleStart THEN 0
                    WHEN ua.Time >= us.Schedule_Stop
                       AND ua.Time =< DATEADD(HOUR, 1, us.Schedule_Stop)
                       THEN 2
                    ELSE 3
                  END
  FROM dbo.UserActivity AS ua
  INNER JOIN dbo.userSchedule AS us ON ua.UserId = us.UserId
更新ua
设置ua.TimeStatusId=CASE
当ua.Time>=us.Schedule\u开始时
ua.Time=DATEADD(小时,-1,美国计划开始)
ua.Time=us.Schedule\u Stop
和ua.Time=
您可以使用
IsNull()
函数来解决您的问题

发布第二个表的定义。或者如果可能需要处理多个值,则使用COALESCE()。