2012-06-27 7 views
9

У меня есть таблица, которая содержит столбцы 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».
В чем должен выглядеть запрос применять только там, где это применимо?

+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); 

Else, вся таблица будет обновлена ​​безоговорочно. Обновления, изменяющие значения до того же значения, все еще обновляются, создавая мертвые строки, триггеры запуска и т. Д. В то время как результирующие строки не будут ошибочными, он все равно раздувает таблицу в два раза по размеру, делая VACUUM необходимым и, как правило, очень медленным.

BTW, любая форма 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.

(BTW: Я думаю, вы имели в виду 'Майкла' вместо 'Micheal'?)

+2

Этот синтаксис CASE не является специфичным для PostgreSQL. . –

+0

@a_horse_with_no_name спасибо, исправлено – leonbloy

Смежные вопросы