IS NULL时的SQL Server Case语句

我正在尝试在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
caffaddt asked 2020-01-16T20:19:33Z
7个解决方案
70 votes
CASE WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)   -- Type DATETIME
     ELSE '-'                                         -- Type VARCHAR
     END AS [DATE]

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

Joachim Isaksson answered 2020-01-16T20:19:51Z
13 votes

我同意Joachim的观点,您应该将连字符替换为2705633217255255834624。但是,如果您确实想要连字符,请将日期转换为字符串:

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

另外,在select语句中不需要distinctgroup by已经为您完成此操作。

Gordon Linoff answered 2020-01-16T20:20:16Z
5 votes

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

SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]
Xin answered 2020-01-16T20:20:36Z
4 votes
  case isnull(B.[stat],0)
  when 0 then dateadd(dd,10,(c.[Eventdate]))
  end

如果您要在同一天添加30天,则可以添加else语句。

Mahesh Sambu answered 2020-01-16T20:20:56Z
3 votes

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

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
Abdullah Zaid answered 2020-01-16T20:21:16Z
1 votes

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

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

b)使用日期时间(例如9999-12-31)作为ELSE值。

answered 2020-01-16T20:21:44Z
0 votes

看一下ISNULL函数。 它可以帮助您将NULL值替换为其他值。 [http://msdn.microsoft.com/en-us/library/ms184325.aspx]

Kees de Wit answered 2020-01-16T20:22:04Z
translate from https://stackoverflow.com:/questions/17869227/sql-server-case-statement-when-is-null