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

Sql 在单个命令中有条件地更新表的多个列,sql,postgresql,sql-update,Sql,Postgresql,Sql Update,我有一个表,其中包含列name、client\u name和requester\u name。我需要将这些列的值从“Mic”更新为“Michael” 以下是一些需要更新的记录: name | client_name | requester_name ------+-------------+---------------- Mic | Jerry | Jack Jack | Mic | Mic Jerry | Jack | Mic 我尝试了以

我有一个表,其中包含列
name
client\u name
requester\u 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”。

如果只在适用的地方应用更改,查询应该是什么样子的?

不是很优雅,也不是很高效,但在一个查询中:

UPDATE names SET 
name =  CASE  name 
    WHEN 'Mic' THEN 'Micheal' ELSE name END,
client_name = CASE  client_name 
    WHEN 'Mic' THEN 'Micheal' ELSE client_name END,
requester_name= CASE  requester_name 
    WHEN 'Mic' THEN 'Micheal' ELSE requester_name END ;
这使用了的缩写(特定于Postgresql)语法


(顺便说一句:我猜你的意思是“Michael”而不是“Micheal”?)

添加
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);
否则,整个表将无条件更新。将值更改为相同值的更新仍然是创建死行、触发触发器等的更新。虽然生成的行不会出错,但它仍然会将表膨胀到其大小的两倍,这就需要
真空
,而且通常速度非常慢


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

当然可以,因为您列出了
SET
子句中的所有列。是否有理由它必须是一条语句而不是3条(每列1条)?@tmpearce Yes,有几个表具有相同的情况,其中的值应在特定条件下更改。我被要求不要生成很多简短的查询:(@Dragon你是想把Jack Mic Mic的值改成Jack Michael,还是仅仅是Michael?这种大小写语法不是特定于PostgreSQL的。它是标准SQL。