Заявление о состоянии 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
Ответы
Ответ 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]
Ответ 7
Взгляните на функцию ISNULL. Это помогает вам заменить значения NULL для других значений. http://msdn.microsoft.com/en-us/library/ms184325.aspx