Microsoft SQL Server:关键字“ CASE”附近的语法不正确

时间:2018-07-10 12:22:45

标签: sql 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 Server17。该怎么办?

3 个答案:

答案 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