SQL Server中的约束创建,包括case语句

时间:2013-09-26 07:19:00

标签: sql-server oracle tsql

我需要为我的一个SQL表创建一个唯一约束,它也将检查两个case语句。这在Oracle中运行良好。但是我无法在SQL Server 2008中使用它。我将这两个查询放在这里。

ORACLE(工作正常):

CREATE UNIQUE INDEX UK2_TR_ASSESSMENTEMPLOYEE ON TR_ASSESSMENTEMPLOYEE
(CASE  WHEN ("EMPLOYEEID" IS NOT NULL AND "SCHEDULE" IS NULL) THEN NULL
ELSE "EMPLOYEEID" END , CASE  WHEN "SCHEDULE" IS NULL THEN NULL 
ELSE "SCHEDULE" END )

SQL Server:

Alter table TR_ASSESSMENTEMPLOYEE 
Add Constraint UK2_TR_ASSESSMENTEMPLOYEE Unique 
(
CASE WHEN EMPLOYEEID Is Not NULL AND SCHEDULE IS NULL THEN NULL ELSE EMPLOYEEID, 
CASE WHEN SCHEDULE IS NULL THEN NULL ELSE SCHEDULE 
)

请救救我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我将在前面加上说明Oracle约束的目的对我来说并不完全清楚。

似乎Oracle示例中的第二个CASE语句是多余的,可以简化为SCHEDULE列而不需要额外的代码,即:

CREATE UNIQUE INDEX UK2_TR_ASSESSMENTEMPLOYEE ON TR_ASSESSMENTEMPLOYEE
(CASE  WHEN ("EMPLOYEEID" IS NOT NULL AND "SCHEDULE" IS NULL) THEN NULL
ELSE "EMPLOYEEID" END , "SCHEDULE")

SQL Server不支持唯一约束条件中的计算。实现类似行为的一种方法是创建计算列并将约束基于:

ALTER TABLE TR_ASSESSMENTEMPLOYEE 
ADD EMPLOYEEID_CALC AS (CASE WHEN EMPLOYEEID IS NOT NULL AND SCHEDULE IS NULL THEN NULL ELSE EMPLOYEEID END)

ALTER TABLE TR_ASSESSMENTEMPLOYEE 
ADD CONSTRAINT UK2_TR_ASSESSMENTEMPLOYEE UNIQUE 
(EMPLOYEEID_CALC,SCHEDULE)

但是,这可能无法为您提供所需的行为 - 在SQL Server中,UNIQUE约束do not allow duplicate NULL keys(违反ANSI SQL标准)。

如果您使用的是SQL 2008或更高版本,则可以使用过滤后的唯一索引来获取所需的行为(假设在EMPLOYEEIDSCHEDULE都不是NULLCREATE UNIQUE INDEX UK2_TR_ASSESSMENTEMPLOYEE ON TR_ASSESSMENTEMPLOYEE(EMPLOYEEID, SCHEDULE) WHERE EMPLOYEEID IS NOT NULL AND SCHEDULE IS NOT NULL 时强制执行唯一性{1}})

{{1}}