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%' ...
条件时,您会自动知道字符串中不存在a
s(否则将满足 case 表达式中的第一个条件)。所以,你的第二个条件可能只是when value like '%d%' then lower(value)
【参考方案1】:
CASE
返回一个值,因此您不需要那里的SET
。 AND
是一个条件运算符,它不能一起运行命令。
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
错误,你不能再用SET
operation
,你不能用separated replace
改变
1.SET value = UPPER(value)
到 UPPER(value)
2.SET value = LOWER(value)
到 LOWER(value)
和
3.remove
秒replace
这样
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 语句缺少关键字错误的更新查询的主要内容,如果未能解决你的问题,请参考以下文章
在 where 子句中使用 case 语句的 Oracle Missing 关键字