mysql - 使用案例更新 SQL 表

标签 mysql sql-update set case

我有一个表,我想通过考虑一些条件来更新特定列。例如,var1 将根据 columnC 字段获得不同的值。我使用下面的代码,在 MySQL Workbench 上没有收到错误,但有 0 行受到影响。当我运行脚本时,var1 不会改变。

update table
  set number = columnA * columnB,
      var1 = case
              when lower(columnC) like '%aaa%' then var1 =  number
              when lower(columnC) like '%bbb%' then var1 =  number * 2
              when lower(columnC) like '%ccc%' then var1 =  number * 4
              else lower(columnC) 
              end,
      var2 = number / var1
;

我尝试用不同的更新分别针对每种情况进行操作。

update table 
set number = columnA * columnB;

效果很好。

update table 
set var1 = number where lower(columnC) like 'aaa';

这根本不起作用。该列不受影响。我还尝试删除“lower”或放置特定的 field.value 而不是变量,但没有成功

最佳答案

您的查询有几个明显的问题。首先是 else 子句。

其次,case 中有 =。这是一个 bool 比较,将返回 0 或 1。

但是,问题可能是您希望“按顺序”执行 set 子句。也就是说,您希望首先计算 number,然后 var1 可以使用该数字,依此类推。但这并不是update 的工作原理(无论是在 MySQL 还是其他数据库中)。左侧的值来自“旧”记录。右侧的值在"new"记录中设置。

所以:

update table
  set number = columnA * columnB,
      var1 = columnA * columnB *
             (case when lower(columnC) like '%aaa%' then 1
                   when lower(columnC) like '%bbb%' then 2
                   when lower(columnC) like '%ccc%' 4
                   else 1
              end),
      var2 = number / var1
      var2 = (case when lower(columnC) like '%aaa%' then 1/1.0
                   when lower(columnC) like '%bbb%' then 1/2.0
                   when lower(columnC) like '%ccc%' 1/4.0
                   else 1.0
              end);

我不确定 else 子句应该是什么。我只是将其设置为与“aaa”选项相同。

关于mysql - 使用案例更新 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33125095/

相关文章:

mysql - 学习sql建表报错

oracle - 如何在 Oracle SQL 中使用相同的子查询更新同一个表中的多个列

python - 在 Python 中设置子类时定义 __repr__

mysql - "Invalid use of group function"当插入重复键更新时

c++ - 在 C++ 中修复观察者设计模式

python - 为什么 Python 的 filter(predicate, set) 不返回一个集合?

PHP 循环 INSERT MySQL 获取每个结果

尝试更改表时 Python MySQLdb 错误

export - 每当数据更改时 MySQL 自动导出为 .SQL

MySQL 从转换为 varchar 的 datetime 中删除剩余时间。子字符串()?