sql - 在单个命令中有条件地更新表的多个列

标签 sql postgresql sql-update

我有一个表,其中包含 nameclient_namerequester_name 列。我需要将这些列的值从“Mic”更新为“Michael”。

以下是一些应该更新的记录:

name  | client_name |  requester_name
------+-------------+----------------
Mic   | Jerry       | Jack
Jack  | Mic         | Mic
Jerry | Jack        | Mic

我尝试了以下查询:

UPDATE names
SET name='Michael', client_name='Michael', requester_name='Michael'
WHERE name='Mic' OR client_name='Mic' OR requester_name='Mic';

此查询使所有列的所有名称都更改为“Michael”。
查询应该是什么样子才能仅在适用的地方应用更改?

最佳答案

添加一个 WHERE 子句是明智的。

UPDATE names
SET    name = CASE WHEN name = 'Mic' THEN 'Michael' ELSE name END
      ,client_name = CASE WHEN client_name = 'Mic' THEN 'Michael'
                     ELSE client_name END
      ,requester_name = CASE WHEN requester_name = 'Mic' THEN 'Michael'
                        ELSE requester_name END
WHERE 'Mic' IN (name, client_name, requester_name);

否则,将无条件更新整个表。将值更改为相同值的更新仍然是创建死行、触发触发器等的更新。虽然生成的行不会出错,但它仍然会使表膨胀到其大小的两倍,这使得 VACUUM 成为必需,并且通常非常慢。

顺便说一句,CASE 语句的任何一种形式在这里都很好。

关于sql - 在单个命令中有条件地更新表的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230465/

相关文章:

php - 如何实现另一个表的table_info

mysql GROUP BY 子句验证

sql - 在 PostgreSQL 中交换具有 UNIQUE 约束的列的记录值

postgresql - 无法从客户端连接到 PostgreSQL - 错误超时

php - 我如何使用 SQL 和 PHP 更新这些表条目?

mysql - 查找重复项,然后使用主表中的 id 更新表,然后删除表中的记录

sql - 当较早时间戳不存在条目时,从 sql 操作中排除行

sql - 为什么 "Null Like X"和 "Not (Null Like X)"相等?

python - SQLAlchemy 添加日期时间列,整数列转换为分钟间隔

mysql - 错误(错误代码 : 1175) during executing update command on table using MySQL Workbench 5. 2