首页 > 解决方案 > Microsoft SQL Server:关键字“CASE”附近的语法不正确

问题描述

我有一个 oracle 数据库,在其中我使用 CASE 生成了这三个 SQL 语句:

create unique index MGDEF_UK2 on MAI_GROUP_DEF(case when results ='y'
THEN CONFIG_ID||'-'|| MAI_CLASS_ID||'-'|| LEVEL_1||'-'|| LEVEL_2||'-'|| 
LEVEL_3||'-'|| LEVEL_4 ELSE null END);

CREATE UNIQUE INDEX PPSTAT_S_UK2 on PATTERN_PROC_STATUSES(case when
STATUS_SHORT is null THEN '1' ELSE STATUS_SHORT END);

CREATE UNIQUE INDEX RL_UK on RUN_LOG(CASE WHEN status ='R'
THEN status ELSE NULL END);

现在我使用 liquibase 将数据库迁移到 Microsoft SQL Server,生成的语句如下所示:

CREATE UNIQUE NONCLUSTERED INDEX MGDEF_UK2 ON [MAI_GROUP_DEF](CASE "RESULTS" WHEN 'y' 
THEN TO_CHAR("CONFIG_ID")||'-'||TO_CHAR("MAI_CLASS_ID")||'-'||TO_CHAR("LEVEL_1")
||'-'||TO_CHAR("LEVEL_2")||'-'||TO_CHAR("LEVEL_3")||'-'||TO_CHAR("LEVEL_4") 
ELSE NULL END)
GO

CREATE UNIQUE NONCLUSTERED INDEX PPSTAT_S_UK2 ON [PATTERN_PROC_STATUSES]
(CASE  WHEN "STATUS_SHORT" IS NULL THEN '1' ELSE "STATUS_SHORT" END)
GO

CREATE UNIQUE NONCLUSTERED INDEX RL_UK ON [RUN_LOG](CASE "STATUS" WHEN 'R' 
THEN "STATUS" ELSE NULL END)
GO

当我运行这些语句时,会发生此错误:

Incorrect syntax near the keyword 'CASE'.

我尝试了不同教程的语法,但仍然出现此错误。我正在使用 Microsoft SQL Server 17。我该怎么办?

标签: sqlsql-servercase

解决方案


SQL Server 使用+而不是||字符串连接。此外,它不支持表达式索引。相反,您需要使用持久计算列。

此外,SQL Server 支持筛选索引。所以第三个例子是:

CREATE UNIQUE INDEX RL_UK on RUN_LOG(status) WHERE status = 'R';

SQL Server 不允许NULL索引中有重复值,所以第二个是:

CREATE UNIQUE INDEX PPSTAT_S_UK2 ON PATTERN_PROC_STATUSES(STATUS_SHORT);

第一个很复杂:

alter table MAI_GROUP_DEF
    add newcol (case when results = 'Y' then . . .  end) persisted;

记得使用+for 表达式。

CREATE UNIQUE INDEX MGDEF_UK2 ON MAI_GROUP_DEF(newcol)

推荐阅读