Подтвердить что ты не робот

Заявление о состоянии SQL Server, когда IS NULL

Я пытаюсь сделать функцию типа оператора IF на сервере SQL.

Если в поле есть 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
4b9b3361

Ответ 1

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

Вам нужно выбрать один или несколько полей для поля, тип поля не может меняться по строке. Самое простое - удалить ELSE '-' и позволить ему неявно получить значение NULL вместо этого для второго случая.

Ответ 2

Я согласен с Joachim, что вы должны заменить дефис NULL. Но если вы действительно хотите дефис, преобразуйте дату в строку:

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

Кроме того, distinct не нужен select. group by уже делает это для вас.

Ответ 3

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

вы можете добавить инструкцию else, если хотите добавить 30 дней к тому же.

Ответ 4

Ваш дефис в вашем заявлении ELSE не принимается в столбце, который определяется в типе данных datetime. Вы можете:

a) Оберните CAST вокруг поля [stat], чтобы преобразовать его в представление varchar даты

b) Используйте значение datetime, например 9999-12-31, для вашего значения ELSE.

Ответ 5

В этой ситуации вы можете использовать функцию ISNULL() вместо выражения CASE

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

Ответ 6

Вы можете использовать IIF (я думаю, из SQL Server 2012)

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