是否可以在SQL Server计算列中使用Case语句

时间:2016-01-04 22:05:08

标签: sql-server tsql sql-server-2012

我有一个包含两个日期列的表,都允许空值。

如果FileDate不为null,则AsOfDate需要等于(FileDate - Offset),其中Offset是一个默认为零的整数列。

这是我的表格def:

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)

不幸的是,计算出的列错误对话框在对表达式进行故障排除方面没有显示出很多帮助。

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

案例表达式在这里完全有效,但不需要您想要的输出。让sql server自然地处理NULLS。

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

- 编辑 -

这里演示的是一个表定义。似乎这完全符合您的要求。

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

答案 1 :(得分:0)

我假设你的表达是正确的。只需对case使用正确的语法。

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