0

我有一个有 2 列的表

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

我想对 x 的值强制约束 y。

例如,当 x = 5 时我想要 y='a',当 x = 12 时 y = 'b' 等等。是否可以在 SQL Server 2008 中执行?就像是

case when x = 5 then y='a' end

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

4

3 回答 3

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

于 2010-12-15T14:09:37.277 回答
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 或“后备”规则(我自己的,刚刚发明的术语):

嵌套案例:

    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
于 2010-12-15T14:04:47.450 回答
0

可以设置这样的约束。参照。链接文本 您需要定义一个合适的 UDF。

啊,好像还有其他的可能。

于 2010-12-15T14:08:44.797 回答