63

I'm trying to do an IF statement type function in SQL server.

Where there is a NULL in the field, I want it to take a field from one of the tables and add 10 days to it.

And if possible create another column and add the 30 days.

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

The result would look sort of like:

    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
4

8 回答 8

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

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

于 2013-07-25T21:44:48.067 回答
17

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

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

此外,您的陈述distinct中没有必要。已经为您做到了selectgroup by

于 2013-07-25T23:24:30.330 回答
7

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

SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]
于 2017-03-15T08:43:51.443 回答
5
  case isnull(B.[stat],0)
  when 0 then dateadd(dd,10,(c.[Eventdate]))
  end

如果你想增加 30 天,你可以添加 else 语句。

于 2013-07-25T21:51:49.683 回答
4

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

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
于 2016-08-27T08:31:33.500 回答
1

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

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

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

于 2013-07-25T21:51:39.723 回答
0

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

于 2013-07-25T21:44:38.807 回答
0

mssql 的 Mahesh 解决方案略有不同:

case when isnull(B.[stat],0) = 0 
     then dateadd(dd,10,(c.[Eventdate]))  
end
于 2021-08-05T18:03:43.973 回答