시스템의 오류가 데이터베이스에서 남성 (M)을 여성 (W)으로, 그 반대로 잘못 명명 한 것으로 나타났습니다. 열은 하나의 문자 만 허용합니다. 임시 테이블을 사용하지 않고 하나의 업데이트 쿼리를 작성하여이 문제를 해결하십시오.
이 질문은 최근에 진행된 인터뷰에서 질문을 받았으며 비슷한 질문이있을 수있는 더 많은 인터뷰를 진행하고 있는데이를 처리하는 방법에 대한 아이디어를 얻고 싶었습니다.
시스템의 오류가 데이터베이스에서 남성 (M)을 여성 (W)으로, 그 반대로 잘못 명명 한 것으로 나타났습니다. 열은 하나의 문자 만 허용합니다. 임시 테이블을 사용하지 않고 하나의 업데이트 쿼리를 작성하여이 문제를 해결하십시오.
이 질문은 최근에 진행된 인터뷰에서 질문을 받았으며 비슷한 질문이있을 수있는 더 많은 인터뷰를 진행하고 있는데이를 처리하는 방법에 대한 아이디어를 얻고 싶었습니다.
답변:
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' );
IIF()
와 함께 IF()
그것은 MySQL의에서 일 것이다)
두 값만 전환하려면 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
식을 사용하는 솔루션 은 더 읽기 쉽고 유지 관리하기가 쉬울 것이므로 두 개 이상의 값으로 확장하는 것이 더 쉬울 것입니다.
M
및 W
예기치 않은 피하기 위해 대문자로 입력 된 7
또는`-` 결과에 나타나는.
ASCII(Gender)
으로 ASCII(UPPER(Gender))
많지 않지만, 덜 우아하다.
WHERE
절에 의해 거부되지 않습니까?
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>
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;
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
결과를 확인하기 위해. 롤백을 사용하여 트랜잭션을 수행하고 예상 한 결과와 일치 할 때 커밋으로 전환합니다.