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.