mysql case в операторе обновления с REPLACE - PullRequest
3 голосов
/ 18 ноября 2010

У меня сейчас есть что-то вроде этого:

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;

Это правильный путьделать это?Я новичок в случае / когда.Спасибо!

1 Ответ

4 голосов
/ 18 ноября 2010

Поскольку вы используете 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%';
...