반갑습니다!
이번 포스트에서는 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문에 대해서 살펴보았습니다 ^^
아직 여러 내용이 남아있으니 앞으로 천천히 다루도록 하겠습니다!
'MySQL > MySQL 기본 CRUD' 카테고리의 다른 글
[기본 CRUD] 10. DELETE문으로 데이터 삭제하기 (0) | 2024.08.07 |
---|---|
[기본 CRUD] 9. INSERT문으로 데이터 추가(삽입)하기 (0) | 2024.08.07 |
[기본 CRUD] 7. 기본적인 수치 연산하기(덧셈, 뺄셈, 곱셈, 나눗셈, 모듈연산) (0) | 2024.08.07 |
[기본 CRUD] 6. LIMIT 키워드로 데이터 일부 갯수만 조회하기 (0) | 2024.08.07 |
[기본 CRUD] 5-2. ORDER BY 키워드로 복수 컬럼에 대해 데이터 정렬하기 (0) | 2024.08.07 |