用案例更新 SQL table

Update SQL table with cases

我有一个 table,我想通过考虑一些条件来更新特定的列。例如,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 中有 =。这是一个布尔比较,将 return 0 或 1。

但是,问题可能在于您希望执行 set 子句 "sequentially"。也就是说,您希望首先计算 number,然后 var1 可以使用该数字,依此类推。但这不是 update 的工作方式(在 MySQL 或其他数据库中)。左侧的值来自 "old" 记录。右边的值在 "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" 选项相同。