하나의 업데이트 명령문으로 열에서 값 전환


12

시스템의 오류가 데이터베이스에서 남성 (M)을 여성 (W)으로, 그 반대로 잘못 명명 한 것으로 나타났습니다. 열은 하나의 문자 만 허용합니다. 임시 테이블을 사용하지 않고 하나의 업데이트 쿼리를 작성하여이 문제를 해결하십시오.

이 질문은 최근에 진행된 인터뷰에서 질문을 받았으며 비슷한 질문이있을 수있는 더 많은 인터뷰를 진행하고 있는데이를 처리하는 방법에 대한 아이디어를 얻고 싶었습니다.


6
특정 데이터베이스 제품을 가정하라는 요청을 받았습니까? 예 : MySQL, SQL Server, Oracle, PostgreSQL ...?
Paul White 9

시스템이 새로운 커뮤니티 지침을 읽었습니까? : \
AER

답변:


23

CASE일부 유형 의 표현식 을 사용하려고 합니다.

SQL Server에서 코드는 다음과 같습니다.

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M'
                  ELSE gender END

편집 : 의견 (및 다른 답변 중 일부)에 명시된 바와 같이 진술에 WHERE 절을 넣으면 ELSE가 필요하지 않습니다.

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M' END
WHERE gender IN ('M','W')

이것은 불필요한 업데이트를 피합니다. 두 경우 모두 중요한 것은 M & W 이외의 옵션이 있으며 (예 : NULL) 잘못된 정보를 입력하고 싶지 않다는 것을 기억하는 것입니다. 예를 들면 다음과 같습니다.

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  ELSE 'M' END

이것은 NULL (또는 가능한 다른 성별)을 'M'으로 대체하여 올바르지 않습니다.


다른 몇 가지 옵션은

/*Simple form of CASE rather than Searched form*/
UPDATE TableName
SET    gender = CASE gender
                  WHEN 'M' THEN 'W'
                  WHEN 'W' THEN 'M'
                END
WHERE  gender IN ( 'M', 'W' );

그리고 더 간결한

/*For SQL Server 2012+*/
UPDATE TableName
SET    gender = IIF(gender = 'M', 'W', 'M')
WHERE  gender IN ( 'M', 'W' ); 

1
당신은 대체 할 수 IIF()와 함께 IF()그것은 MySQL의에서 일 것이다)
ypercubeᵀᴹ

9

Oracle에서는 다른 답변과 마찬가지로 CASE를 사용할 수 있습니다.

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M'
             END
WHERE gender in ('M','W');

DECODE를 사용할 수도 있습니다.

UPDATE TableName SET gender = DECODE(gender,'M','W','W','M')
WHERE gender in ('M','W');

5

두 값만 전환하려면 CASE식을 사용하지 않는이 트릭을 시도해 볼 수도 있습니다 (여기서 Transact-SQL 가정).

UPDATE
  YourTable
SET
  Gender = CHAR(ASCII('M') + ASCII('W') - ASCII(Gender))
WHERE
  Gender IN ('M', 'W')
;

전류의 값에 따라 Gender, ASCII(Gender)어느 상쇄 것 ASCII('M')또는 ASCII('W')의해 변환되는 다른 코드를두고 CHAR()대응하는 문자 기능 백.

그래도 비교를 위해 이것을 남겨두고 있습니다. 이 옵션은 우아함을 지니고 있지만 CASE식을 사용하는 솔루션 은 더 읽기 쉽고 유지 관리하기가 쉬울 것이므로 두 개 이상의 값으로 확장하는 것이 더 쉬울 것입니다.


2
의 모든 희망하자 MW예기치 않은 피하기 위해 대문자로 입력 된 7또는`-` 결과에 나타나는.
Martin Smith

@MartinSmith : 아주 좋은 지적입니다. 그들이 아니었다면, 우리는 교체해야합니다 ASCII(Gender)으로 ASCII(UPPER(Gender))많지 않지만, 덜 우아하다.
Andriy M

@MartinSmith 소문자 m과 w가 있으면 WHERE절에 의해 거부되지 않습니까?
ypercubeᵀᴹ

1
@ YperSillyCubeᵀᴹ-대소 문자 구분이있는 경우 (일반적인 IME가 아님)
Martin Smith

4

case ... when식으로 할 수 있습니다 .

mysql> select * from genderswap;
+--------+
| gender |
+--------+
| F      |
| F      |
| M      |
| M      |
| M      |
| M      |
| M      |
+--------+
7 rows in set (0.00 sec)

mysql> 
mysql> UPDATE genderswap SET gender = case 
    ->                                when gender='M' then 'F' 
    ->                                when gender='F' then 'M'
    ->                                end
    -> WHERE gender IN ('M', 'F');
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7  Changed: 7  Warnings: 0

mysql> 
mysql> select * from genderswap;
+--------+
| gender |
+--------+
| M      |
| M      |
| F      |
| F      |
| F      |
| F      |
| F      |
+--------+
7 rows in set (0.00 sec)

mysql> 

2

case표현식으로 업데이트를 사용합니다 .

DECLARE @Test TABLE
    (
      Name VARCHAR(100) NULL
    , Gender CHAR(1) NULL
    );

INSERT  INTO @Test
        ( Name, Gender )
VALUES  ( 'Jonathan', 'W' )
         ,
        ( 'Kelly', 'M' );

SELECT  Name
      , Gender
FROM    @Test;

UPDATE  @Test
SET     Gender = CASE WHEN Gender = 'M' THEN 'W'
                      ELSE 'M'
                 END;

SELECT  Name
      , Gender
FROM    @Test;

-1

case식을 사용하여이 업데이트를 수행 할 수 있습니다.

UPDATE names_table
   SET names_table.gender = ( CASE
                                  WHEN names_table.gender = 'M'
                                    THEN 'W'
                                  ELSE
                                      names_table.gender = 'M'
                              END)

트랜잭션 내에서 update 문을 실행하고 다음과 같은 간단한 쿼리를 추가하는 것이 좋습니다.

SELECT n.gender, *
FROM names_table

결과를 확인하기 위해. 롤백을 사용하여 트랜잭션을 수행하고 예상 한 결과와 일치 할 때 커밋으로 전환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.