2012-06-27 39 views
9

我有一个表,其中包含列name,client_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'; 

该查询,使所有列更改所有名称为“迈克尔”。
查询看起来应该如何应用更改(如果适用)?

+0

当然是这样,因为你列出了'SET'子句中的所有列。 –

+0

是否有一个原因,它必须是一个单一的声明,而不是3(每列1)? – tmpearce

+0

@tmpearce是的,有几个表的情况相似,其中值应该在特定条件下进行更改。我被要求不要产生很多短的查询:( – Dragon

回答

11

这将是明智的添加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声明在这里都不错。

1

不是很优雅,不是很有效,但在一个查询:

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的具体)的CASE语法。

(顺便说一句:我想你的意思,而不是“迈克尔”“迈克尔”?)

+2

CASE语法不是PostgreSQL特有的,它是标准的SQL 。 –

+0

@a_horse_with_no_name谢谢,修正 – leonbloy

相关问题