在MySQL的UPDATE语句中使用REPLACE的CASE语句

4
我目前有类似这样的东西:

我目前有类似这样的东西:

UPDATE table1  SET column1 = REPLACE(column1, 'abc', 'abc1') WHERE column1 LIKE '%abc%';
UPDATE table1  SET column1 = REPLACE(column1, 'def', 'def1') WHERE column1 LIKE '%def%';

我正在尝试将它们合并为一条单独的更新语句,尝试以下操作:

UPDATE table1
SET column1 = 
CASE
WHEN column1 LIKE '%abc%' THEN REPLACE(column1, 'abc', 'abc1')
WHEN column1 LIKE '%def%' THEN REPLACE(column1, 'def', 'def1')
ELSE column1
END;

这是正确的做法吗?我对case/when不熟悉。谢谢!


总体而言,您正在使用的功能非常缓慢。LIKEMATCH ... AGAINST 慢,后者比相等比较慢。CASE WHEN 也很慢。话虽如此 - 如果您有一个经常访问的大表,则进行2个UPDATE可能更方便,因为表的锁定时间会更短。 - Mikhail
你为什么想要合并这两个更新语句?我认为最好还是分别进行两次更新。 - Ike Walker
问题在于目前有大约20个语句,我只是为了简单起见放了2个。是否最好仍然保留所有单独的语句? - Dima
1个回答

5
由于您使用了LIKE '%abc%',因此更新语句将需要完整的表扫描。在这种情况下,合并两个语句将提高总体性能。然而,在您的建议中,每一行都会被更新,其中大部分行在没有更改的情况下被更新(column1的值被替换为column1的值)。
您需要确保保留WHERE子句,以便只更改真正需要更改的行。这种不必要的磁盘写入比检查行是否符合条件要慢。
请执行以下操作:
UPDATE table1
SET column1 = 
CASE
WHEN column1 LIKE '%abc%' THEN REPLACE(column1, 'abc', 'abc1')
WHEN column1 LIKE '%def%' THEN REPLACE(column1, 'def', 'def1')
END
WHERE column1 LIKE '%abc%' OR column1 LIKE '%def%';

哦,对了,我完全忘记在我的帖子中包含“where”(我在代码中有这个!) - Dima
还有一个问题,这只有在所有初始更新语句彼此独立的情况下才能起作用,对吗? (即没有一行符合多个LIKE条件,因此每行最多只会更新一次) - Dima
1
@lolcat: 正确的。如果有一行数据符合多个LIKE条件,它只会被更新一次,即第一个符合条件的CASE语句。比如说,如果你的值是“abcdef”,它将会被更新为“abc1def”,而不是“abc1def1”。 - Ike Walker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接