CASE를 사용하여 UPDATE 쿼리에서 열을 선택 하시겠습니까?


13

쿼리 (Postgres) CASE에 표시 할 열을 SELECT다음과 같이 선택할 수 있습니다 .

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

UPDATEPostgres 에서 쿼리를 수행 할 때 가능한 어떤 것이 있습니까 (예 : 업데이트 할 열 선택)? 나는 이것에 대해 아무것도 찾을 수 없었기 때문에 가정하지는 않지만 누군가가 영리한 대안을 가지고있을 것입니다 (절차를 사용하거나 열을 사용하여 각 열을 업데이트하여 열의 CASE값에 새로운 값을 할당하거나 단순히 기존 값을 다시 할당 해야하는지 여부를 결정하는 것) 값). 쉬운 대안이 없다면 물론 대답으로 받아 들일 것입니다.

추가 정보 : 필자의 경우 업데이트 할 수있는 14 개의 잠재적 열이 있으며 일치하는 행당 하나만 업데이트됩니다 (업데이트 할 테이블은 쿼리에서 다른 열과 조인 됨). 업데이트 할 행 수는 다양 할 수 있으며 수십 또는 수백이 될 수 있습니다. 나는 가입 조건에 대한 인덱스가 있다고 생각합니다.

답변:


26

열을 업데이트하도록 지정하면 항상 업데이트 되지만 조건부로 입력 한 값을 변경하고 조건에 따라 원래 값을 되돌릴 수 있습니다. 다음과 같은 것 :

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 절을 필터링 할 때이 상황을 명시 적으로 게이트 하지 않으면 일치하는 모든 행 에 업데이트 표시됩니다 (모든 열이 이미 보유한 값으로 설정되어 있어도). 쓰기가되지 않으면 인덱스가 업데이트되고 적절한 트리거가 실행됩니다.


업데이트되는 모든 것에 대한 팁을 주셔서 감사합니다.이 속도가 느리면 @Colin 't Hart의 제안에 여러 개의 업데이트 문이있을 수 있습니다.
newenglander

ON 및 WHERE 절이 변경이 필요하지 않은 모든 행을 필터링하도록하여 문제가 완전히 완화 될 수 있지만, SET 절과 WHERE 절 모두에서 모든 조건이 반복되는 것을 의미 할 수 있습니다 (단순한 전체 점검이없는 한). 모든 조건을 합한 것과 100 % 동일합니다). 이 시점에서이 방법은 여전히 ​​더 효율적일 수 있지만 다중 업데이트 방법은 유지 관리가 더 쉬울 수 있습니다.
David Spillett

같은 값으로 열을 업데이트하면 리두가 생성됩니다. orainternals.wordpress.com/2010/11/04/…
Colin 't Hart

@Colin : 예, 모든 업데이트는 필드가 이전과 동일한 값을 갖도록 필드를 업데이트하기 때문에 본질적으로 NoOps 인 업데이트를 포함하여 DB의 트랜잭션 로그를 통과합니다. 추가 행 업데이트 작업으로 필요한 공간 / 대역폭이 증가하므로 복제, 차등 백업, 로그 전달 등을 사용하는 경우 즉각적인 성능 문제의 가능성뿐만 아니라 이는 중요한 요소가 될 수 있습니다.
David Spillett

팁을 주신 두 분께 감사드립니다. 제 경우에는 단일 업데이트 설명이 제대로 작동했습니다.
newenglander

5

업데이트 할 열 조합은 몇 개입니까? 전체 테이블에서 몇 개의 행이 업데이트됩니까? 업데이트 할 행에 빠르게 액세스 할 수있는 인덱스가 있습니까?

이러한 질문에 대한 답변에 따라 업데이트하려는 각 열에 대해 하나씩 여러 개의 업데이트 문을 실행하고 업데이트의 where 절에서 해당 열의 값에 조건을 배치하여 해당 열의 경우 행 0이 업데이트되도록 할 수 있습니다 값이 잘못되었습니다.

세트 기반을 시도하고 생각하십시오. 업데이트가 기본 키로 찾은 단일 행을 업데이트해야한다고 가정하지 마십시오.


답변 해주셔서 감사합니다. 내 질문에 더 많은 정보를 추가했는데 이해할 수 있기를 바랍니다. 여러 업데이트 문을 사용하는 좋은 대안입니다 (하나의 업데이트 문을 선호하지만 이점이 있음을 알 수 있습니다).
newenglander

이것은 내가 찾고있는 대답 일 수 있지만 @val = 0 인 update column_x = new_value_for_x를 넣는 것을 의미합니까? 나는 그런 것을 실험 할 수 있습니다. 재미있어 보인다. val = 0이 column_x = new_value_for_x 등을 업데이트하기 시작하면 쉽지 않습니다.
CashCow

-1
update Practicing  -- table you will be updating
 set email = case -- column you will be updating
    when FName = 'Glenn' then 'Ace@Assasin.com'
       when FName = 'Riddick' then 'fallguy@Drunk.com'
       when FName = 'Jeffrey' then 'sorcerer@wizcom'
       else email
    end

asker는 조건에 따라 다른 열을 업데이트하는 방법을 알고 싶어하지만 단일 열만 업데이트합니다.
Colin 't Hart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.