SQL Server:如何在查询中使用'case when'?

时间:2012-11-27 08:04:33

标签: sql-server database sql-server-2008-r2 case-when

我尝试case when nullnot null设置为值ErrorCode字段。

实施例

EmpNo|ChkDate                |ChkIn                  |ChkOut                 |ErrorCode
00001|2012-10-01 00:00:00.000|2012-10-01 07:21:00.000|2012-10-01 17:05:00.000|0
00002|2012-10-01 00:00:00.000|2012-10-01 22:17:00.000|2012-10-01 00:00:00.000|6
00003|2012-10-01 00:00:00.000|2012-10-01 00:00:00.000|2012-10-01 19:30:00.000|6
00004|2012-10-01 00:00:00.000|NULL                   |NULL                   |7
00005|2012-10-01 00:00:00.000|2012-10-01 07:10:00.000|2012-10-01 12:00:00.000|0
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|0

但我需要输出(ErrorCode)

EmpNo|ChkDate                |ChkIn                  |ChkOut                 |ErrorCode
00001|2012-10-01 00:00:00.000|2012-10-01 07:21:00.000|2012-10-01 17:05:00.000|0
00002|2012-10-01 00:00:00.000|2012-10-01 22:17:00.000|2012-10-01 00:00:00.000|6
00003|2012-10-01 00:00:00.000|2012-10-01 00:00:00.000|2012-10-01 19:30:00.000|6
00004|2012-10-01 00:00:00.000|NULL                   |NULL                   |7
00005|2012-10-01 00:00:00.000|2012-10-01 07:10:00.000|2012-10-01 12:00:00.000|8
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|8
在ChkIn和ChkOut估价的

是半天。我需要设置值= 8.但我尝试= 0.

此代码:

SELECT
   tf.EmpNo, tf.ChkDate, tf.ChkIn, tf.ChkOut,
   CASE
      WHEN ChkIn is not null and Convert(nvarchar(10), ChkOut,108) != '00:00:00'
         THEN 0
      WHEN ChkIn is not null and Convert(nvarchar(10) ,ChkOut,108) = '00:00:00'
         THEN 6
      WHEN Convert(nvarchar(10),ChkIn,108) = '00:00:00' and ChkOut is not null
         THEN 6
      WHEN Convert(nvarchar(10),ChkOut,108) <= '12:00:00'
         OR Convert(nvarchar(10),ChkOut,108) >= '12:00:01' Then 8
      WHEN ChkIn is null and ChkOut is null THEN 7 
   END as 'ErrorCode'
FROM filesTA tf
WHERE tf.ChkDate = '2012-10-01'

2 个答案:

答案 0 :(得分:0)

问题似乎是你的条件重叠&#34;。我的意思是说早期条件适用(在你的情况下:第一个),后面的条件也适用,但case语句在第一个匹配时结束。

您需要做的是重新调整您的条件,以便他们唯一地识别每个案例。

您的第一个条件是ChkIn不应该nullChkOut不应该等于00:00:00。虽然这种情况对于您期望结果为8的行也是如此,但第一个&#34;匹配&#34;由case语句应用。

修改
但是,我确实不太了解您的输出预期何时为0以及预期为8的要求。也许你可以进一步解释应该返回哪个值的确切条件。我很难理解ChkIn和ChkOut中的值得半天。我需要设置值= 8。

答案 1 :(得分:0)

您必须提供在案例陈述中不会错误地返回true的条件。您可以尝试以下方法将之前的计算移动8:

SELECT
   tf.EmpNo, tf.ChkDate, tf.ChkIn, tf.ChkOut,
   CASE
      WHEN Convert(nvarchar(10),ChkOut,108) <= '12:00:00'
         OR Convert(nvarchar(10),ChkOut,108) >= '12:00:01' Then 8
      WHEN ChkIn is not null and Convert(nvarchar(10), ChkOut,108) != '00:00:00'
         THEN 0
      WHEN ChkIn is not null and Convert(nvarchar(10) ,ChkOut,108) = '00:00:00'
         THEN 6
      WHEN Convert(nvarchar(10),ChkIn,108) = '00:00:00' and ChkOut is not null
         THEN 6
      WHEN ChkIn is null and ChkOut is null THEN 7 
   END as 'ErrorCode'
FROM filesTA tf
WHERE tf.ChkDate = '2012-10-01'

但这只会让0永远不会出现。事实是你的愿望并不清楚。为什么EmpNo 1获得代码0,但EmpNo 5和6获得8?你是如何定义全天和半天的?如果没有经过一段时间的计算,你将无法区分那些,我无法从你现有的查询中看出逻辑应该是什么。当值0,6,7和8应该应用于一行时,请更清楚地解释。