Eu posso usar CASE
para escolher quais colunas exibir em uma SELECT
consulta (Postgres), assim:
SELECT CASE WHEN val = 0 THEN column_x
WHEN val = 1 THEN column_y
ELSE 0
END AS update, ...
É possível algo semelhante ao realizar uma UPDATE
consulta no Postgres (ou seja, escolher quais colunas devem ser atualizadas)? Presumo que não, pois não consegui encontrar nada sobre isso, mas talvez alguém tenha uma alternativa inteligente (além de usar um procedimento ou atualizar cada coluna usando um CASE
para determinar se o valor da coluna deve ser atribuído um novo valor ou simplesmente reatribuido o valor existente valor). Se não houver uma alternativa fácil, é claro que também a aceitarei como resposta.
Informações extras : No meu caso, tenho 14 colunas em potencial que podem ser atualizadas, com apenas uma sendo atualizada por linha correspondente (a tabela a ser atualizada é unida a outra na consulta). A quantidade de linhas a serem atualizadas provavelmente varia, pode ser dezenas ou centenas. Acredito que existam índices para as condições de adesão.
Se você especificar que uma coluna deve ser atualizada, ela sempre será atualizada, mas você pode alterar o valor inserido condicionalmente e colocar de volta os valores originais, dependendo de suas condições. Algo como:
Portanto, se as condições não estiverem corretas para uma atualização de uma coluna específica, basta retornar o valor atual.
Observe que cada linha correspondida verá uma atualização (mesmo que todas as colunas acabem sendo definidas para os valores que já possuem) , a menos que você explicitamente bloqueie essa circunstância ao filtrar as cláusulas ON e WHERE, o que pode ser um problema de desempenho (haverá ser uma gravação, os índices serão atualizados, os gatilhos apropriados serão acionados, ...) se não forem mitigados.
Quantas combinações diferentes de colunas para atualizar você tem? Quantas linhas de toda a tabela serão atualizadas? Os índices estão em vigor para acesso rápido às linhas para atualização?
Dependendo das respostas a essas perguntas, você poderá executar várias instruções de atualização, uma para cada coluna que deseja atualizar e colocar a condição no valor dessa coluna na cláusula where da atualização para que zero linhas sejam atualizadas se essa coluna tem o valor errado.
Tente pensar baseado em conjunto, não assuma que a atualização precisa atualizar uma única linha encontrada pela chave primária.