我需要为我的一个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
)
请救救我。提前谢谢。
答案 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或更高版本,则可以使用过滤后的唯一索引来获取所需的行为(假设在EMPLOYEEID
和SCHEDULE
都不是NULL
和CREATE UNIQUE INDEX UK2_TR_ASSESSMENTEMPLOYEE
ON TR_ASSESSMENTEMPLOYEE(EMPLOYEEID, SCHEDULE)
WHERE EMPLOYEEID IS NOT NULL AND SCHEDULE IS NOT NULL
时强制执行唯一性{1}})
{{1}}