Использовать CASE для выбора столбцов в запросе UPDATE?

Я могу использовать CASE, чтобы выбрать столбцы для отображения в SELECT (Postgres), например:

SELECT CASE WHEN val = 0 THEN column_x
            WHEN val = 1 THEN column_y
            ELSE 0
       END AS update, ...

Возможно ли что-то подобное при выполнении запроса UPDATE в Postgres (т. е. выбрать, какие столбцы должны быть обновлены)? Я предполагаю, что, поскольку я ничего не мог найти об этом, но, возможно, у кого-то есть умная альтернатива (помимо использования процедуры или обновления каждого столбца с помощью CASE, чтобы определить, нужно ли присвоить значение столбцу новое значение или просто переназначить существующее значение). Если нет простой альтернативы, я, конечно, соглашусь с этим и в качестве ответа.

Дополнительная информация : В моем случае у меня есть 14 потенциальных столбцов, которые могут быть обновлены, причем только одна обновляется в каждой строке соответствия (обновляемая таблица объединяется с другой в запросе). Количество строк для обновления, скорее всего, будет меняться, может быть десятки или сотни. Я считаю, что индексы установлены для условий соединения.

8 голосов | спросил newenglander 12 PMpFri, 12 Apr 2013 14:55:11 +040055Friday 2013, 14:55:11

3 ответа


20

Если вы укажете, что столбец должен быть обновлен, он всегда будет обновлен, , но вы можете изменить введенное значение условно и вернуть исходные значения в зависимости от ваших условий. Что-то вроде:

UPDATE some_table
SET    column_x = CASE WHEN should_update_x THEN new_value_for_x ELSE column_x END
     , column_y = CASE WHEN should_update_y THEN new_value_for_y ELSE column_y END
     , column_z = CASE WHEN should_update_z THEN new_value_for_z ELSE column_z END
FROM   ...

Итак, если условия не соответствуют обновлению для определенного столбца, вы просто возвращаете его текущее значение.

Обратите внимание, что каждая строка, соответствующая , будет видеть обновление (даже если все столбцы в конечном итоге получают значения, которые у них уже есть) , если явно не заблокировать это обстоятельство в которой вы фильтруете предложения ON и WHERE, что может быть проблемой производительности (будет запись, индексы будут обновлены, соответствующие триггеры будут срабатывать, ...), если не будут смягчены.

ответил David Spillett 12 PMpFri, 12 Apr 2013 15:28:54 +040028Friday 2013, 15:28:54
4

Сколько различных комбинаций столбцов для обновления у вас есть? Сколько строк всей таблицы будет обновлено? Имеются ли индексы для быстрого доступа к строкам для обновления?

В зависимости от ответов на эти вопросы вы можете выполнять несколько операторов обновления, по одному для каждого столбца, который вы хотите обновить, и поместить условие на значение этого столбца в предложение where для обновления, чтобы обновить нулевые строки если этот столбец имеет неправильное значение.

Попробуйте и подумайте о наборе, не предполагайте, что обновление должно обновить одну строку, найденную первичным ключом.

ответил Colin 't Hart 12 PMpFri, 12 Apr 2013 15:08:44 +040008Friday 2013, 15:08:44
-1
update Practicing  -- table you will be updating
 set email = case -- column you will be updating
    when FName = 'Glenn' then '[email protected]'
       when FName = 'Riddick' then '[email protected]'
       when FName = 'Jeffrey' then '[email protected]'
       else email
    end
ответил user134695 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 04:01:13 +0300 2017, 04:01:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132