2012-06-27 7 views
9

私は列name,client_nameおよびrequester_nameを含むテーブルを持っています。これらの列の値を「マイク」から「マイケル」に更新する必要があります。ここで1つのコマンドで条件付きでテーブルの複数の列を更新する

が更新されなければならないいくつかのレコードです:

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)ではなく、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); 

これ以外の場合、テーブル全体が無条件で更新されます。値を同じ値に変更する更新は、まだ不完全な行を作成したり、トリガをトリガするなどの更新が行われます。結果の行は間違ってはいませんが、それでもテーブルを2倍に膨らませてVACUUMを必要とし、一般に非常に遅くなります。

ところで、いずれの形式のCASEもここでは良いです。

1

非常に非常に効率的で、エレガントではない、しかし、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 ; 

これはCASEの省略(PostgreSQLの特定)構文を使用しています。

(ところで:私はあなたの代わりに「マイケル」の「マイケル」を意味推測?)

+2

そのCASE構文はPostgreSQL特有ではありません。 。 –

+0

@a_horse_with_no_nameありがとう、固定 – leonbloy

関連する問題