12

nameと の列を含むテーブルがありclient_nameますrequester_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」に変更します。
該当する場合にのみ変更を適用するには、クエリはどのようなものにする必要がありますか?

4

2 に答える 2

26

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ステートメントでもかまいません。

于 2012-06-27T17:50:56.087 に答える
5

あまりエレガントではなく、あまり効率的ではありませんが、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 固有の)構文を使用します。

(ところで: 「Micheal」ではなく「Michael」を意味していたと思いますか?)

于 2012-06-27T16:21:40.080 に答える