Некой забележки
- Мисля че беше IIF - Immediate IF (а не IF) MySQL оператора, но може и да е имало (скорошни) промени
- доколкото разбрах той по-скоро ще иска CASE WHEN ID == 11 THEN 1 WHEN ID ==2 THEN 22 etc.
- и да - за сървъри които не поддържат TVP (Table Value parameters) динамичен SQL (като горния) от страна на клиента е спасението, но си има и некои ограничения напр. да внимава да не прехвърли макс., размер на пакета който сървъра може да обработи - мисля за MySQL по подразбиране 8 Мб и май можеше да се наглася от админа до 16 (по новите версии може и да може до повече не го следя от неколко декади mySQL-a) и.. дотам - като удариш тоя лимит трябва да затваряш текущата и да почваш нова SQL команда
т.е. колега ако ти е сравнително малка таблицата или с малко обновявания кото ще се съберат в една завка (за цялата таблица с новти ст-ти) "мрежовата цена" ще ти е само "времето за изпълнение на една заявка по мрежата" - няма да е много бавно
П.П. Unfortunately MySql didn't implement table-valued parameters, but alternatives do exist:
- TEMP table
- JSON - MYSQL 8 supports JSON tables, so you could load your results into a JSON variable and select from that variable using the JSON_TABLE() command.
- CSV string +parse in UDF /Using a delimited string ("str1,str2,str3") which significantly downgrades performance, especially when the string is very long./
- и класически метод който си работи от време оно който описах по-горе:
който има няколко варианта (вече го правят и с временна таблица от кода направо)
при всички тези варианти по-долу трябва да се внимава да не се превиши размера на пакета - според както е настроен сървъра
GeSHi (SQL):
-- класически стил
UPDATE table1 SET val1= CASE id
WHEN 1 THEN 5
WHEN 3 THEN 8
WHEN 4 THEN 7
ELSE val1
END,
val2= CASE id
WHEN 2 THEN 13
WHEN 4 THEN 5
ELSE val2
END
WHERE id IN (1, 2, 3, 4);
-- съвременен вариант който не съществуваше до скоро (но още са далеч от М$ TVP)
-- със или без темп таблица
GeSHi (SQL):
INSERT INTO TABLE (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);
GeSHi (SQL):
UPDATE my_table m
JOIN (
SELECT 1 AS id, 10 AS _col1, 20 AS _col2
UNION ALL
SELECT 2, 5, 10
UNION ALL
SELECT 3, 15, 30
) vals ON m.id = vals.id
SET col1 = _col1, col2 = _col2;
П.П.П. Внимание - горните "мрежови" алтернативи задължително да се ползват в транзакция - за всеки слулчай ако напр. ред 1000 от 1М фърли грешка (напр. INT OVERFLOW) да не остане таблицата само наполовина обновена