Oracle SQL - 使用 Case 语句缺少关键字错误的更新查询

Posted

技术标签:

【中文标题】Oracle SQL - 使用 Case 语句缺少关键字错误的更新查询【英文标题】:Oracle SQL- Update Query with Case Statement Missing Keyword Error 【发布时间】:2017-06-05 12:48:59 【问题描述】:

我对 SQL 非常陌生(3 天前开始学习),所以我假设我的代码中有一些可怕的语法错误。

我从昨天开始一直在尝试创建一个更新查询,该查询使用案例根据以下条件修改value 列:

    value 包含字母“a”时,将值设为大写。 当value 包含字母“d”但不包含字母“a”时,将value 设为小写。 当value不满足上述条件时,将value的首尾字母改为1和2。

我尝试了很多不同的方法,但我总是以某种错误告终。此代码返回缺少关键字错误:

UPDATE t1  
SET value = 
CASE   WHEN value LIKE '%a%' THEN SET value = UPPER(value)   
       WHEN value LIKE '%d%' AND value NOT LIKE '%a' THEN SET value = LOWER(value)   
       ELSE REPLACE(value,'_%','1') AND REPLACE(value,'%_','2') 
END
Where value IS NOT NULL; 

【问题讨论】:

值得注意的是,因为 case 表达式会使逻辑短路(即它在第一个满足的条件时停止处理),当您达到when value like '%d%' ... 条件时,您会自动知道字符串中不存在as(否则将满足 case 表达式中的第一个条件)。所以,你的第二个条件可能只是when value like '%d%' then lower(value) 【参考方案1】:

CASE 返回一个值,因此您不需要那里的SETAND 是一个条件运算符,它不能一起运行命令。

REPLACE() 无法按照您尝试使用的方式工作。它需要文字而不是通配符。因此,除非value 以下划线开头和结尾,否则'_%' 命令不会改变任何内容。而不是REPLACE(),我建议您使用 SUBSTR() 并连接替换字符。

UPDATE t1  
SET value = 
    CASE   WHEN value LIKE '%a%' THEN UPPER(value)   
           WHEN value LIKE '%d%' AND value NOT LIKE '%a' THEN LOWER(value)   
           ELSE '1'||substr(value, 2, length(value)-2) ||'2' 
    END
Where value IS NOT NULL;

或者,您可以使用正则表达式替换功能

ELSE regexp_replace(value, '^(.)(.*)(.)$', '1\22' 

但是,当value 的长度为 1 时,输出会略有不同。

【讨论】:

【参考方案2】:

Case statment中有很多syntex错误,你不能再用SEToperation,你不能用separated replace

改变

1.SET value = UPPER(value)UPPER(value) 2.SET value = LOWER(value)LOWER(value) 和 3.removereplace这样

UPDATE t1  
SET value = 
CASE   WHEN value LIKE '%a%' THEN SET UPPER(value)   
       WHEN value LIKE '%d%' AND value NOT LIKE '%a' THEN LOWER(value)   
       ELSE REAPLACE(REPLACE(value,'_%','1'),'%_',2)
END
Where value IS NOT NULL; 

【讨论】:

以上是关于Oracle SQL - 使用 Case 语句缺少关键字错误的更新查询的主要内容,如果未能解决你的问题,请参考以下文章

CASE SQL 语句 oracle 数据库

在 where 子句中使用 case 语句的 Oracle Missing 关键字

甲骨文。使用 case 语句时缺少关键字。错误 00905

在 Case 语句中使用计算 - Oracle SQL

如何在oracle sql中的where条件中使用case语句?

如何从oracle sql中的选择计数中对rownum使用case语句?