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

时间:2017-06-05 12:49:00

标签: sql string oracle case

我是SQL的新手(3天前开始学习),所以我假设我的代码中有一些可怕的语法错误。

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

  1. value包含字母'a'时,请将值设为大写。
  2. 如果value包含字母'd',但不包含字母'a',请将value设为小写。
  3. 如果value不符合上述条件,请将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; 中的第一个和最后一个字母更改为1和2。
  4. 我尝试过这么多种不同的方式,但我总是遇到某种错误。此代码返回Missing Keyword Error:

    public static Expression Sum(IList<Expression> expressions)
    {
        Expression result = expressions[0];
        foreach (var expression in expressions.Skip(1))
        {
            result = Expression.Add(result, expression);
        }
    
        return result;
    }
    

2 个答案:

答案 0 :(得分: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时,输出略有不同。

答案 1 :(得分:0)

syntex中有很多Case statment错误,您无法再次使用SET operation而您无法使用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;