이전포스트에 이어서 작성하는 내용입니다.
2022.02.07 - [공부/mysql] - Mysql 기본명령어 10 (날짜 연산)
이번에는 CASE문을 활용하여 데이터를 변환하는 방법입니다.
이는 임의의 조건에 따라 자신이 설정한 변환처리를 통해 데이터를 변환하여 반환할 때 사용하는 명령어입니다.
만약 NULL 값을 0으로 간주하여 처리하고 싶은 경우, CASE를 활용하여 이를 적용할 수도 있습니다.
그럼 CASE 명령어 문법에 대해 알아보겠습니다.
CASE WHEN 조건식 THEN 식
[ WHEN 조건식 THEN 식 .. ]
[ ELSE 식 ]
END
- WHEN : 참 or 거짓을 반환하는 조건식
- THEN : TRUE일 때, THEN의 명령어 수행
- ELSE : 아무 조건도 만족하지 못한 경우, 반환되는 값이지만 ELSE는 생략도 가능함
그렇다면 바로 실습을 해보도록 하겠습니다.
SELECT a, CASE WHEN a IS NULL THEN 0
ELSE a END
"a(NULL = 0)" FROM sample37;
먼저 기존의 a 컬럼은 NULL 값이 포함되어 있는 상태입니다. 하지만 CASE를 활용하여 명령어를 다음과 같이 수행하면 'a 값이 NULL일 때, 0으로 반환하고 a가 NULL이 아니면 a를 그대로 반환하는데, a(NULL = 0)의 값으로 sample37 테이블에서 수행해라.'라는 명령어로 다음과 같이 출력할 수 있습니다.
COALESCE 명령어
앞서 NULL = 0으로 값을 변환하였는데, 사실 NULL을 반환하는 것은 COALESCE 함수가 더 편리합니다.
동일한 출력문을 얻고 싶은 경우에는 다음과 같은 명령어를 사용하면 됩니다
SELECT a, COALESCE(a, 0) FROM sample37;
INT형 데이터로 이뤄진 값이 만약 남, 여를 의미하는 값일 때는 이를 STRING으로 변환해주는 작업이 필요할 수 있습니다. 이때 수치데이터를 문자로 바꾸는 것을 디코드라고 부릅니다. (반대로 문자를 수치로 변환하는 경우는 인코드)
위의 a 컬럼 값이 1 = 남자, 2 = 여자일 때는 WHEN a = 1 THEN '남자' WHEN a = 2 THEN '여자' 와 같이 입력하면 될 것입니다.''
이를 시행해보면 다음과 같습니다.
SELECT a AS "코드",
CASE WHEN a = 1 THEN '남자' WHEN a = 2 THEN '여자' ELSE '미지정' END
AS '성별' FROM sample37;
이런 형태의 CASE는 검색 CASE 명령어입니다. 이는 a=1, a=2로 식을 지정해야 합니다. 하지만 단순 CASE의 경우에는 CASE와 WHEN사이에 비교 항목을 지정하여 a=1, a=2형태의 식을 입력하지 않아도 가능합니다.
식은 다음과 같습니다.
SELECT a AS "코드",
CASE a WHEN 1 THEN '남자' WHEN 2 THEN '여자' ELSE '미지정' END
AS '성별' FROM sample37;
여기서 ELSE를 사용하지 않는다면 ELSE NULL로 처리가 됩니다. 이 경우, a = 1 or 2가 아닌 데이터는 NULL값으로 반환되게 됩니다. 위에서는 NULL이 그대로 NULL로 반환되겠지만, a = 3인 데이터가 있는 경우도 NULL로 반환되게 되는 것입니다. 따라서 ELSE는 생략하지 않는 편이 좋습니다.
또한
SELECT a AS "코드",
CASE a WHEN 1 THEN '남자' WHEN 2 THEN '여자' WHEN NULL THEN '데이터없음' ELSE '미지정' END
AS '성별' FROM sample37;
을 사용하여 NULL값을 처리하는 경우에는 NULL은 미지정으로 반환되게 됩니다.
이는 a = 1, a = 2의 형태로 조건문을 비교하는 형태로 진행되기 때문입니다. 애초에 a = NULL이라는 식이 성립하지 않기 때문입니다. 따라서 이와 같은 형태로 반환하려면
SELECT a AS "코드",
CASE WHEN a=1 THEN '남자' WHEN a=2 THEN '여자' WHEN a IS NULL THEN '데이터 없음' ELSE '미지정' END
AS '성별' FROM sample37;
과 같이 사용해야 합니다.
'공부 > mysql' 카테고리의 다른 글
Mysql 기본명령어 12 (INSERT) (0) | 2022.02.09 |
---|---|
Mysql 기본명령어 10 (날짜 연산) (0) | 2022.02.07 |
Mysql 기본명령어 9 (문자열 연산) (0) | 2022.02.07 |
Mysql 기본명령어 8 (수치 연산) (0) | 2022.01.27 |
Mysql 기본명령어 7 (LIMIT, OFFSET) (0) | 2022.01.27 |
댓글