IS NULL时的SQL Server Case语句

时间:2013-07-25 21:39:19

标签: sql sql-server sql-server-2008

我正在尝试在SQL server中执行IF语句类型函数。

如果字段中有NULL,我希望它从其中一个表中获取一个字段并添加10天。

如果可能的话,创建另一列并添加30天。

SELECT DISTINCT
    B.[ID],
    MAX(A.[START DATE]),
    B.[STAT],
    C.[POST DATE],
    CASE
          WHEN (C.[POST DATE] BETWEEN C.[EVENT DATE]+10 AND C.[EVENT DATE]+30) THEN 'GOOD'
          END AS [BETTER VISIT],
    CASE
          WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)
          ELSE '-'
          END AS [DATE]
FROM 
    #TEMP1 A
    FULL OUTER JOIN #TEMP2 B
    ON A.[ID]=B.[ID]
    FULL OUTER JOIN #TEMP3 C
    ON A.[ID]=C.[ID]
GROUP BY
    B.[ID],
    B.[STAT],
    C.[POST DATE],
    C.[EVENT DATE]
ORDER BY
    A.[START DATE] DESC

结果看起来有点像:

    ID  START DATE   STAT    POST DATE    BETTER VISIT    DATE         DATE2
    ---------------------------------------------------------------------------
    1   2013-01-01   GOOD    2013-11-01   GOOD            -            -
    2   2013-03-01   NULL    NULL         NULL            2013-03-11   2013-03-31

8 个答案:

答案 0 :(得分:67)

CASE WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)   -- Type DATETIME
     ELSE '-'                                         -- Type VARCHAR
     END AS [DATE]

您需要为字段选择一种类型或另一种类型,字段类型不能按行变化。 最简单的方法是删除ELSE '-'并让其隐含地获取值NULL,而不是第二种情况。

答案 1 :(得分:13)

我同意Joachim你应该用NULL替换连字符。但是,如果你真的想要一个连字符,请将日期转换为字符串:

(CASE WHEN B.[STAT] IS NULL
      THEN convert(varchar(10), C.[EVENT DATE]+10, 121)
      ELSE '-'
 END) AS [DATE]

此外,distinct声明中不需要selectgroup by已为您完成此操作。

答案 2 :(得分:5)

您可以使用IIF(我认为来自SQL Server 2012)

SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]

答案 3 :(得分:4)

  case isnull(B.[stat],0)
  when 0 then dateadd(dd,10,(c.[Eventdate]))
  end

如果你想在同一时间内添加30天,你可以添加else语句。

答案 4 :(得分:2)

在这种情况下,您可以使用ISNULL()函数代替CASE表达式

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]

答案 5 :(得分:1)

在日期时间数据类型下定义的列中不接受您的ELSE语句中的连字符。你可以:

a)在[stat]字段周围包裹CAST,将其转换为日期的varchar表示

b)使用类似9999-12-31的日期时间作为您的ELSE值。

答案 6 :(得分:0)

看看ISNULL功能。它可以帮助您替换其他值的NULL值。 http://msdn.microsoft.com/en-us/library/ms184325.aspx

答案 7 :(得分:0)

针对 mssql 的 Mahesh 解决方案的细微变化:

case when isnull(B.[stat],0) = 0 
     then dateadd(dd,10,(c.[Eventdate]))  
end