본문 바로가기
공부/mysql

Mysql 기본명령어 11 (CASE)

by signature95 2022. 2. 8.
728x90
반응형

이전포스트에 이어서 작성하는 내용입니다.

2022.02.07 - [공부/mysql] - Mysql 기본명령어 10 (날짜 연산)

 

Mysql 기본명령어 10 (날짜 연산)

이전 포스트에 이어서 작성하는 내용입니다. 2022.02.07 - [공부/mysql] - Mysql 기본명령어 9 (문자열 연산) Mysql 기본명령어 9 (문자열 연산) 이전 포스트에 이어서 작성하는 내용입니다. 2022.01.27 - [공부

signature95.tistory.com

 

 

이번에는 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;

 

혹은 정말 동일하게 a(NULL = 0)을 입력하면 컬럼 명까지 동일하게 출력이 가능함

 

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;

과 같이 사용해야 합니다.

 

728x90

댓글