2016-01-04 4 views
0

У меня есть таблица с двумя столбцами даты, и оба разрешения допускают.Возможно ли иметь оператор Case в вычисляемом столбце SQL Server

Если FileDate не является нулевым, то AsOfDate должен быть равен (FileDate - Offset), где Offset - целочисленный столбец с нулевым значением по умолчанию.

Вот мой стол Защита:

CREATE TABLE [import].[CMAR_GLXXXX](
[FileDate] [date] NULL, 
[LoadDTM] [date] NULL, 
[AsOfDate] [date] NULL, 
[AccountNumber] [varchar](50) NOT NULL, 
[CostCenter] [varchar](50) NOT NULL, 
[OffSet] [int] default (0) NOT NULL, 
[Value] [decimal](10,2) NOT NULL 
) ON [PRIMARY] 

Я попытался с помощью следующих действий:

(case when [File] IS NULL then NULL else dateadd(day,(-1 * [Offset]),[FileDate]) end) 

К сожалению диалогового окно ошибки столбца вычисленное не отображает большую помощи в устранении неполадок выражения.

Любые идеи?

+0

Вы можете поделиться своим полным заявлением 'create table', пожалуйста? – Mureinik

+0

Будут делать, но имена команд разные. Я уберу вопрос, чтобы они совпали. – bsivel

+0

'CASE' не является выражением - это ** выражение ** (например,' a + b'), которое может возвращать одно атомное значение (из набора возможных альтернатив). И да - выражение 'CASE' может использоваться везде, где может использоваться любое другое выражение, в том числе в вычисляемом определении столбца. –

ответ

6

Выражение для случая совершенно справедливо здесь, но не требуется для желаемого результата. Пусть сервер sql обрабатывает NULLS естественным образом.

dateadd(day,(-1 * x),[d1]) 

--EDIT--

Чтобы продемонстрировать здесь является определение таблицы. Кажется, это именно то, что вы ищете.

create table #Something 
(
    x int 
    , d1 datetime 
    , compCol as dateadd(day, (-1 * x), [d1]) 
) 

insert #Something 
select 3, null union all 
select 4, '2016-01-01' 

select * 
from #Something 
+0

. Спасибо SL. Следующее теперь работает с моей таблицей: case filedate when null then null else dateadd (dd, - 1 * offset, filedate) end – bsivel

+0

... и да - нет необходимости в аргументе case в моем сценарии. Следующие работы отлично: dateadd (dd, -1 * offset, filedate) – bsivel

0

Я предполагаю, что ваше выражение верное. просто используйте правильный синтаксис для случая.

CREATE TABLE CMAR_GLXXXX(
[FileDate] [date] NULL, 
[LoadDTM] [date] NULL, 
[AsOfDate] [date] NULL, 
[AccountNumber] [varchar](50) NOT NULL, 
[CostCenter] [varchar](50) NOT NULL, 
[OffSet] [int] default (0) NOT NULL, 
[Value] [decimal](10,2) NOT NULL 
) 

select 
(case when [FileDate] IS NULL then NULL else dateadd(day,(-1 * [OffSet]),[FileDate]) end) 
from CMAR_GLXXXX 
Смежные вопросы