基于条件的更新查询

xzlaal3s  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(202)

我想做以下工作。根据另一个字段的值更新字段,如

update table set if(fielda=1){fieldb=2 fieldc=3}else{fieldd=2 fielde=3}

我知道这是无效的mysql,但它是我描述问题的最好方式。

5anewei6

5anewei61#

我认为这种语法将达到您试图指定的结果。

UPDATE mytable
   SET fieldb = CASE WHEN fielda = 1 THEN 2 ELSE fieldb END
     , fieldc = CASE WHEN fielda = 1 THEN 3 ELSE fieldc END
     , fieldd = CASE WHEN fielda = 1 THEN fieldd ELSE 2 END
     , fielde = CASE WHEN fielda = 1 THEN fielde ELSE 3 END

这里的“诀窍”是我们更新所有四列,但在某些“情况”下,我们将列的当前值赋回到列,导致列值没有实际更改(一旦你把心思集中在这个想法上,就很容易了。)
在mysql中,我们确实有一个方便的if函数(在大多数其他rdbms中不可用),我们可以使用它来简化它,并实现相同的功能:

UPDATE mytable
   SET fieldb = IF(fielda = 1, 2, fieldb)
     , fieldc = IF(fielda = 1, 3, fieldc)
     , fieldd = IF(fielda = 1, fieldd, 2)
     , fielde = IF(fielda = 1, fielde, 3)

痛苦的是你仍然要重复同样的条件测试多次。
对表格进行一次扫描(就像这些语句所做的那样),一下子完成所有这些任务将比分解这些任务并使用多个语句逐段完成任务更快(更高效)。

ntjbwcob

ntjbwcob2#

update table set
b = case when a = 1 then 2 else b end,
c = case when a = 1 then 3 else c end,
d = case when a = 1 then d else 2 end,
e = case when a = 1 then e else 3 end

编辑

根据你的评论,试试这个:

update table set
datefield_a = case when field_a = 1 then now() else datefield_a end,
datefield_b = case when field_a <> 1 then now() else datefield_b end

相关问题