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

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

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

  1. value 包含字母“a”时,将值设为大写。
  2. value 包含字母“d”但不包含字母“a”时,将value 设为小写。
  3. 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)

标签: sql string oracle case


【解决方案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; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-17
      • 2020-01-27
      • 2023-03-20
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      相关资源
      最近更新 更多