0

我需要为我的一个 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 服务器:

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 
)

请救救我。提前致谢。

4

1 回答 1

0

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

似乎CASEOracle 示例中的第二条语句是多余的,可以简化为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约束不允许重复NULL(违反 ANSI SQL 标准)。

如果您使用的是 SQL 2008 或更高版本,则可以使用过滤的唯一索引来获得您想要的行为(假设这是为了在 whereEMPLOYEEIDSCHEDULEare not 都强制执行唯一性NULL

CREATE UNIQUE INDEX UK2_TR_ASSESSMENTEMPLOYEE 
ON TR_ASSESSMENTEMPLOYEE(EMPLOYEEID, SCHEDULE) 
WHERE EMPLOYEEID IS NOT NULL AND SCHEDULE IS NOT NULL
于 2013-09-26T08:39:37.097 回答