在另一列中指定检查当前年份的列中的默认值

时间:2019-07-11 09:14:52

标签: sql sql-server tsql

我正在尝试使用默认值创建一列。默认值的计算如下:

  1. “期间”列(同一表)是否包含当前年份?如果是这样,则默认值为列“ AnswerA”(同一表)

  2. 如果不包含当前年份,则默认值为“ AnswerB”列(同一表)

我认为应该这样做:

CREATE TABLE dbo.[testComputed](
[Id] int IDENTITY(1,1) NOT NULL,
[Period] nvarchar(100) NOT NULL,
[AnswerA] char NOT NULL,
[AnswerB] char NOT NULL,
[ComputedColumn] char NULL DEFAULT (
    iif( [Period] Contains(CONVERT(nvarchar(5),YEAR(GETDATE()))), [AnswerA], [AnswerB]))

Period列不是Date类型,它是这样的:01/2019

我不确定是否有可能,我希望它是正确的,但是我缺乏一些基本的知识来执行。

1 个答案:

答案 0 :(得分:0)

您可以将列定义为:

ComputedColumn as (case when Period like concat('%', year(getdate()), '%')
                        then AnswerA else AnswerB
                   end)

从表中获取数据时将计算ComputedColumn。因此,当年份更改时,值也将更改。

我不确定“可编辑”是什么意思。列的默认值不能包含列引用(使用用户定义的函数可以解决此问题,但这似乎有点过头)。

由于总是在当年插入数据,因此可以使用触发器分配值。

但是,最好使用覆盖值列(可更新),然后:

OverrideValue char(1),
ComputedColumn as (case when OverrideValue is not null
                        then OverrideValue
                        when Period like concat('%', year(getdate()), '%')
                        then AnswerA else AnswerB
                   end)