我有很多字段需要大量替换而不破坏该列中的其他数据。
如果我运行:
UPDATE ospos_items AS a
INNER JOIN ospos_items AS b ON a.item_id = b.item_id
SET a.custom7 = 'Detective Novels'
WHERE a.custom7 = 'DN'
AND a.custom3 = 'English Literature';
更新完全是非破坏性的。但是,如果我运行以下代码以合并查询:
UPDATE ospos_items AS a
INNER JOIN ospos_items AS b ON a.item_id = b.item_id
SET a.custom7 = CASE
WHEN a.custom7 = 'DN' THEN 'Detective Novels'
WHEN a.custom7 = 'HF' THEN 'Historical Fiction'
WHEN a.custom7 = 'HUM' THEN 'Humor'
WHEN a.custom7 = 'NOV' THEN 'Novels'
WHEN a.custom7 = 'YA' THEN 'Young Adults'
END
WHERE a.custom3 IN('English Literature');
它将该列中的所有值设置为在 CASE 中找不到的 NULL。例如,该列中的某些字段已被转换。如何使我的第二个查询对 CASE 语句中未找到的值无损?
请您参考如下方法:
有两种解决方法:
- 将
ELSE a.custom7
添加到CASE
表达式。如果WHEN
条件都不匹配,它将保持相同的值。 - 将
AND a.custom7 IN ('DN', 'HF', 'HUM', 'NOV', 'YA')
添加到WHERE
子句。然后它只会更新其中一个CASE
表达式匹配的行。
顺便说一句,当您在每个 WHEN
子句中测试同一列时,您可以使用更简单的方法:
CASE a.custom7
WHEN 'DN' THEN 'Detective Novels'
WHEN 'HF' THEN 'Historical Fiction'
...
END