mysql - 如何在 SET 中使用 MySQL CASE 而不破坏它?

标签 mysql

我有很多字段需要大量替换而不破坏该列中的其他数据。

如果我运行:

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 语句中未找到的值无损?

最佳答案

有两种解决方法:

  1. ELSE a.custom7 添加到CASE 表达式。如果 WHEN 条件都不匹配,它将保持相同的值。
  2. 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

关于mysql - 如何在 SET 中使用 MySQL CASE 而不破坏它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60149248/

相关文章:

mysql timestampdiff 总是返回 null?

mysql:仅在满足某些条件时插入

mysql - 我的 django 中不断出现 2006 错误(服务器消失),这是为什么?

mysql - 连接两个表而不丢失相关值

MySQL:限制 2,-1

mysql - 来自表决表的 Echo SQL 查询

java - 找不到适用于 jdbc :mysql://localhost:3306/test 的合适驱动程序

mysql - Zend_DB - 使用 native MySQL 适配器而不是 MySQLi 或 PDO?

mysql - mysql中逐行统计列中的单词数

php - Zend Framework 多数据库停止使用慢速查询