SQL Server 2008:相对于另一个列值限制列值

时间:2010-12-15 13:55:21

标签: sql-server-2008 constraints check-constraints

我有一个包含2列的表

CREATE TABLE mytable
(
  x int
  y char(1)
)

我想对x的值强制执行约束。

例如,当x = 5时,我希望y ='a',当x = 12 y ='b'时依此类推。 是否可以在SQL Server 2008中执行此操作?像

这样的东西
case when x = 5 then y='a' end

后一种说法不起作用,因此,我要求模拟。

3 个答案:

答案 0 :(得分:1)

CREATE TABLE mytable
(
  x int not null,
  y char(1) not null,
  constraint CK_mytable_myrules CHECK (
    1 = CASE
          WHEN x=5 AND y='a' THEN 1
          WHEN x=12 AND y='b' THEN 1
        /* More rules here */
          ELSE 0 END
)

CASE 表达式始终必须返回。布尔值不是SQL的一部分。


或者,如果一般规则是“如果我们没有匹配任何这些规则,那就让它通过”,那么你有两个选择 - 嵌套CASE,或“后备”规则(我自己的,刚刚发明的术语):

嵌套CASE:

    1 = CASE
          WHEN x=5 THEN
             CASE WHEN y='a' THEN 1
                  ELSE 0 END
          WHEN x=12 THEN
             CASE WHEN y='b' THEN 1
                  ELSE 0 END
        /* More rules here */
          ELSE 1 END

或其他方式:

    1 = CASE
          WHEN x=5 AND y='a' THEN 1
          WHEN x=5 THEN 0
          WHEN x=12 AND y='b' THEN 1
          WHEN x=12 THEN 0
        /* More rules here */
          ELSE 1 END

答案 1 :(得分:1)

您可以将表达式设置为:

( x = 5 AND y = 'a' ) OR ( x = 12 AND y = 'b' )

如果您愿意,可以添加更多规则......

使用此SQL将约束添加到表中:

ALTER TABLE dbo.myTable WITH NOCHECK  
      ADD  CONSTRAINT CK_myTable
      CHECK  (( x = 5 AND y = 'a' ) OR ( x = 12 AND y = 'b' ));

查看此参考以获取更多示例:

http://www.databasejournal.com/features/mssql/article.php/3811831/Using-Check-Constraints-to-Validate-Data-in-SQL-Server.htm

答案 2 :(得分:0)

可以设置这样的约束。参看link text 您需要定义合适的UDF。

啊,似乎还有其他可能性。