sql - 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。我该怎么办?
解决方案
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)
推荐阅读
- r - R中有没有办法在定义的连续行上创建ifelse?
- python-3.x - 如何将变量的动态列表添加到命令 pd.concat
- excel - 从另一个工作表中查找和编辑一个工作表
- android - 如何更改工具提示样式
- excel - Excel 2表不同的项目一些相同的项目具有相同的ID,比较行中的值。(动力枢轴)
- java - 如何在 JPA Repository 接口中编写不同的 SQL 子句
- java - 来自 php mysql 的带有 recyclerview、cardview 和 volley 的 Android 完整图像
- excel - 将具有两张工作表的工作簿合并为一个具有相同工作表的工作簿。第二张纸无法正确复印
- c# - 等效于 .Net Core 中的 HttpResponse.StatusDescription 设置状态码描述
- javascript - 如何使用带有正则表达式模式的 Javascript .replace() 限制字符串长度?