【问题标题】:SQL Server: unable to add constraintSQL Server:无法添加约束
【发布时间】:2018-10-05 03:45:58
【问题描述】:

我正在尝试创建一个表格并根据以下标准对价格进行分类:

  • 对于类别 1,值的范围是 7 到 20(含)。
  • 对于类别 2,值的范围是 20 到 50(含)。
  • 对于类别 3,值的范围是 50 到 100(含)。
  • 对于任何其他类别,值的范围是 100 到 350(含)。

但我一直报错

CREATE TABLE LabTest
(
    testCode char(4) not null,
    name char(40) not null,
    category int not null,
    price decimal(30,2) not null,
    ageAppropriate int not null,

    constraint testCode_PK PRIMARY KEY (testCode),
    constraint age_CHK check (ageAppropriate >= 0),
);

ALTER TABLE LabTest
    ADD CONSTRAINT Category_CHK 
        CHECK (CASE Category
                  WHEN Price BETWEEN 7 AND 20 THEN 1
                  WHEN Price BETWEEN 20 AND 50 THEN 2
                  WHEN Price BETWEEN 50 AND 100 THEN 3
                  WHEN Price BETWEEN 100 AND 350 THEN 4
                  ELSE 0    
               END);

【问题讨论】:

    标签: sql-server constraints case between


    【解决方案1】:

    您需要将约束表述为列值等于CASE 表达式:

    ALTER TABLE LabTest
    ADD CONSTRAINT Category_CHK CHECK  
    (
        Category = CASE WHEN Price BETWEEN 7 AND 20 THEN 1
                        WHEN Price BETWEEN 20 AND 50 THEN 2
                        WHEN Price BETWEEN 50 AND 100 THEN 3
                        WHEN Price BETWEEN 100 AND 350 THEN 4
                        ELSE 0 END
    );
    

    旁注:CASE 表达式中的范围实际上是重叠的,因为 BETWEEN 在两端都包含在内。因此,您编写的内容将与以下内容相同:

    CASE WHEN Price >= 7 AND Price <= 20 THEN 1
         WHEN Price > 20 AND Price <= 50 THEN 2
         WHEN Price > 50 AND Price <= 100 THEN 3
         WHEN Price > 100 AND Price <= 350 THEN 4
         ELSE 0 END
    

    如果上述不是您想要处理边界条件的方式,则根据需要更改逻辑。

    【讨论】:

    • 谢谢!!,代码正在运行。比方说,我不想检查,而是想将输入值返回到类别列。能做到吗?
    • 您现在问的是另一个问题,但如果我理解正确,那么计算列可能就是您想要的。您可以根据Price 计算Category
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多