我有一个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 Server17。该怎么办?
答案 0 :(得分:1)
尝试使用+
中的||
代替CASE WHEN
||
适用于Oracle,不适用于sqlserver
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
我会使用CONCAT
函数。组合字符串。
CREATE UNIQUE NONCLUSTERED INDEX mgdef_uk2
ON [MAI_GROUP_DEF](CASE "results"
WHEN 'y' THEN Concat(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
答案 1 :(得分:1)
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;
请记住对表达式使用+
。
CREATE UNIQUE INDEX MGDEF_UK2 ON MAI_GROUP_DEF(newcol)
答案 2 :(得分:0)
大小写语法定义错误。您可以尝试在线查询对流器,以帮助您使用语法: http://www.sqlines.com/online