본문 바로가기
MySQL/MySQL 기본 CRUD

[기본 CRUD] 8. CASE문으로 데이터 변환하기

by Fletcher 2024. 8. 7.

 

반갑습니다!

이번 포스트에서는 CASE문에 대해서 살펴보겠습니다 ^^!

 

비슷한 느낌으로 Java에 switch ~ case문이 있는데요

일정한 형식이 있는 조건에 대해서 판단하는 구문이죠 ^^

 

SQL문을 작성할 때에도 특정 조건과 비교하고

해당 값을 구분해서 삽입해야 할 때가 있습니다

 

예를 들어서, score에 따라서 grade를 매긴다거나 할 때 말이죠 ^^

이렇게 일정한 형식이나 규격을 가지고 있을 때 조건과 비교하여 판단하는

CASE문에 대해서 알아보겠습니다!

 

 

 

 

 

이번에는 두 개의 테이블을 샘플로 사용하겠습니다 ^^

각각 학생들의 이름 정보가 담긴 students 테이블과

제출한 과제의 제목과 점수 정보가 담긴 papers 테이블입니다

 

 

 

 

LEFT JOIN 연산을 통해 살펴보니,

동일 학생이 과제를 두 개 제출한 경우도 있고,

한 학생이 과제를 아예 제출하지 않은 경우도 있네요 ^^

 

그럼 학생들의 grade를 기준으로 과제에 대해 pass / fail 여부를 추가해볼까요?

여기서 CASE문을 사용해보겠습니다 ^^!

 

 

 

 

CASE문 예시1)

 

SELECT 이하 순서에서 CASE문을 사용하였습니다

CASE ~ END가 하나의 덩어리이고 저는 이 결과값을 갖는 컬럼의 별칭을 results라고 지어줬습니다 ^^

 

기본적인 구조는 다음과 같습니다

CASE

WHEN 조건식1 THEN 식1

WHEN 조건식2 THEN 식2

...

ELSE 식3

END 

 

각 WHEN 이하 조건식을 만족하면 그에 따르는 THEN의 식이 적용됩니다 ^^

제 예문에서는,

papers 테이블의 grade 값이 75점 이상이면

"PASS"라는 문자열 값을 삽입하기로 했습니다 ^^

 

 

 

 

 

 

 

CASE문 예시2)

 

grade의 값이 유효한 학생들과 NULL인 학생들을 한 번 더 구분했습니다

grade의 값이 75점 이상이면 PASS,

75점 미만이면 FAIL,

과제 미제출이면 RETAKE로 나타나도록 했습니다 ^^

 

여기서 말씀드리고 싶었던 부분은,

Null인지 아닌지 비교할 때는 등호(=)가 아니라 is를 사용해주셔야 합니다

 

 

그냥 등호를 사용하면 어떤 결과가 출력되는지 확인해볼까요?

 

 

SQL문 실행에 별다른 오류 메세지가 검출되진 않습니다

하지만 출력된 결과를 보면 해당 조건문이 동작하지 않은 것을 확인할 수 있습니다

"is NULL"을 이용한 것과 "= NULL"을 사용한 것이 명확히 구분이 되시죠? ^^

 

NULL인지 아닌지 비교하실 때에는 이 부분 주의하셔야겠습니다!

 

 

 

 

 

※ 참고1 ※

ELSE를 생략시 ELSE NULL이 되는 부분에 주의가 필요합니다

분기점을 나눠서 처리하실 때 혹시 ELSE를 생략하셨다가,

여러 경우의 수 중 사용자의 예측을 벗어난 경우에는 NULL이 부여되므로

의도한 결과와 조금 다를 수도 있으니

ELSE부분의 마무리까지 주의가 필요하겠습니다 ^^

 

 

※  참고2 ※

만약 CASE문을 이용해서 NULL을 처리하실 일이 있다면,

COALESCE() 함수를 사용하는 편이 더 쉽습니다

 

예문만 한 번 들어보겠습니다

SELECT a, COALESCE(a, 0) FROM sample_table;

위 SQL문은 만약 a의 값이 NULL이면 0 값을 삽입하도록 의도하는 명령문입니다 ^^

 

 

 

 

 

이번 포스트에서는 CASE문에 대해서 살펴보았습니다 ^^

아직 여러 내용이 남아있으니 앞으로 천천히 다루도록 하겠습니다!