T-SQL : UPDATE 문에서 CASE를 사용하여 조건에 따라 특정 열 업데이트


108

이것이 가능한지 궁금합니다. 조건이 참이면 x 열을 업데이트하고, 그렇지 않으면 y 열이 업데이트됩니다.

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

나는 모든 것을 검색하고 몇 가지 시도했지만 해결책을 찾을 수 없습니다. 가능하지 않다고 생각하지만 여기에서 물어보고 누군가가 전에 해본 적이 있는지 알아 보겠습니다. 미리 감사드립니다.


모두 같은 테이블에 있다고 가정합니다. 항상 트랜잭션에서 실행하고 오류시 롤백하여 직접 확인할 수 있습니다.
OMG Ponies 2011 년

무슨 말인지 잘 모르겠습니다. 열에 조건부 입력을 시도했지만 작동하지 않습니다. select 문에는 작동하지만 업데이트 문에는 작동하지 않습니다. (select (case (condition) when true then columnx else columny end) from myTable .... 업데이트가 작동하지 않으며 이유를 알 수 있습니다. . t은 작업 할 수있는 방법을 보인다
pqsk

답변:


188

조건을 사용하여 쿼리 구조를 변경할 수 없으며 관련된 데이터 만 변경할 수 있습니다. 다음과 같이 할 수 있습니다.

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

이것은 의미 상 동일하지만 두 열이 항상 업데이트 된다는 점을 명심하십시오 . 이것은 아마 당신에게 어떤 문제가 발생하지 않습니다,하지만 당신은 높은 트랜잭션 볼륨이있는 경우, 다음이 동시성 문제가 발생할 수 있습니다.

구체적 으로 요구하는 작업을 수행하는 유일한 방법 은 동적 SQL을 사용하는 것입니다. 그러나 이것은 당신이 멀리 떨어져 있기를 권장합니다. 위의 솔루션은 거의 확실하게 당신이 추구하는 것에 충분할 것입니다.


동적 SQL에 동의합니다. 그래도 내 데이터가 영향을받을까요? 특정 조건에서 변경되는 것을 원하지 않습니다. 그래서 이미 거기에있는 것을 다시 삽입할까요? db에 대한 히트의 양은 그렇게 나쁘지 않을 수 있습니다.
pqsk

@pqsk : 이것은 데이터에 영향을주지 않아야합니다 . 영향을받지 않을 열에 대해 이미있는 것을 다시 삽입해야합니다 .
Adam Robinson

감사. 나는 이것으로 갈 것입니다. 아주 간단해서 원시인도 할 수 있습니다. ㅋ.
pqsk

1
전달되는 @AdamRobinson 1.5 년은 하나 개의 컬럼 만 업데이트하는 좀 더 효율적인 방법 알고

@Somebodyisintrouble : 한 열을 업데이트하는 유일한 방법은 다른 쿼리를 사용하는 것입니다.
Adam Robinson

23
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

1
Adam의 응답을 복사 했습니까, 아니면 다른 곳에서 가져온 것입니까? ㅋ. 그냥 알아 챘어요.
pqsk

1
@pqsk : 우리의 응답은 ~ 1 분 간격이어서 조금 더 빨리 제출을 클릭했다고 생각합니다.)
Adam Robinson

23
@pqsk : 예, 방금 Adam의 응답 23을 게시하기 몇 초 전에 복사 했습니다. 나는 하나의 빠른 카피 페스터입니다!
Quassnoi

2
@pqsk : 위에 커서를 놓으면 * min ago게시 된 정확한 시간이 표시됩니다.
Quassnoi

2
공평하게 말하면 둘 다 똑같지 만 아담이 당신의 뒤를 쫓았다면 그는 좀 더 자세히 설명했습니다. 그래서 내가 그의 답으로 표시했습니다. 그래도 고마워.
pqsk

4

여기에 이미지 설명 입력

Case 문을 사용하여 8018070777이있는 경우 ContactNo를 8018070999로 변경하거나 업데이트하고 싶습니다.

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

여기에 이미지 설명 입력


1
이것에 대한 이유없는이 쿼리의 UPDATE를 사용하여 [연락처] SET contactNo = 8,018,070,999 contactNo = 8,018,070,777
NewGuy

4

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 이것은 나를 위해 일했습니다.

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

문안 인사


1

나는 이것이 매우 오래된 질문이며 문제가 해결 된 것으로 표시된다는 것을 알고 있습니다. 그러나 테이블에 업데이트 이벤트에 대한 데이터 로깅 트리거가있는 경우와 같은 경우에 문제가 발생합니다. 두 열 모두 업데이트를 받고 로그는 쓸모없는 항목을 만듭니다. 내가 한 방식

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

이제 이것은 위의 솔루션과 같이 테이블에 불필요한 쓰기가 없다는 또 다른 이점이 있습니다.


이것은 좋은 지적이며 좋은 대안입니다! 나는 더 이상이 스레드로 이어지는 원래 코드를 작업하지 않고 있지만 항상 다른 솔루션을 사용하는 것이 좋습니다. 그리고 이것이 좋은 솔루션이라고 생각합니다
pqsk

-1

다음과 같이 다른 답변을 조정하여 "원하지 않는"열 업데이트를 생략 할 수 있다고 생각합니다.
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

내가 알기로는 조건이 충족 될 때만 업데이트됩니다.

모든 주석을 읽은 후 가장 효율적입니다.
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

샘플 테이블 :
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
샘플 데이터 :
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

이제 널을 처리하는 조건부를 작성할 수 있다고 가정합니다. 내 예를 들어, True, False 또는 Null로 평가되는 조건을 작성했다고 가정합니다. 도움이 필요한 경우 알려 주시면 최선을 다하겠습니다.

이제이 두 줄의 코드를 실행하면 ColConditional이 True (1) 인 경우에만 X가 25로 변경되고 ColConditional이 False (0) 인 경우에만 Y가 25로 변경됩니다.

Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0

추신 : null 케이스는 원래 질문이나 질문에 대한 업데이트에서 언급되지 않았지만 보시 다시피이 매우 간단한 대답은 어쨌든 그들을 처리합니다.


1
이것은 실제로 작동하지 않습니다. 첫째, 열이 널을 허용하면 조건이 충족되지 않으면 널 값이 지정됩니다. null이 허용되지 않는 경우 업데이트가 실패합니다. 최종 "효율적인"쿼리는 적어도 TSQL에서는 유효하지 않은 SQL입니다. 특정 엔진에서 이것을 테스트 했습니까?
pqsk

나는 이것을 SQL Server 2005에서 테스트했으며 그림과 같이 완벽하게 작동합니다. 위의 테스트에서 null 값이 업데이트되지 않았기 때문에 왜 투표했는지와 NULL 값이 업데이트되는 것을 보여주는 예를 알고 싶습니다. 나는 항상 가장 간단한 대답이 최선이라고 생각했고 수백만 개의 레코드가있는 데이터베이스를 다루는 경우 불필요한 행을 업데이트하고 싶지 않습니다.
John Greiner 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.