Day to_day

CASE WHEN 사용하기 본문

SQL

CASE WHEN 사용하기

m_inglet 2022. 11. 2. 10:32
728x90
반응형

프로그래머스 SQL 알고리즘 문제를 풀면서 대충은 알고 있었지만 사용하기엔 익숙지 않은 문법이 나와서 한번 정리를 해보려고 한다.

 

우선 문제와 정답 코드 및 출력결과를 보자

 

 

 

지시사항

중성화된 동물은 SEX_UPON_INTAKE컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

 

정답 코드

SELECT ANIMAL_ID, NAME, (CASE WHEN (SEX_UPON_INTAKE LIKE 'Neutered%') 
              OR (SEX_UPON_INTAKE LIKE 'Spayed%')
              THEN 'O' ELSE 'X' END) AS 중성화
FROM ANIMAL_INS;

 

 

출력 결과

 

 

 

 

 

 

해설


처음 시도했던 코드

SELECT ANIMAL_ID, NAME, 
	(CASE WHEN SEX_UPON_INTAKE LIKE ('Neutered%' OR 'Spayed%')
	THEN 'O' ELSE 'X') AS 중성화
FROM ANIMAL_INS;

내가 놓쳤던 부분

1. CASE WHEN 맨 뒤에 붙지 않은 END

2. LIKE를 OR로 묶어서 한번에 처리하려고 한 점

 

 

내가 처음 시도했던 코드를 고치기 전에 우선 "CASE WHEN" 문법을 조금 정리하고 가야겠다.

 

 

 

 

 

 

 

 

CASE WHEN


CASE WHEN 조건 THEN 반환 값 ELSE 조건 END

  • WHEN 과 THEN은 한 쌍이다.
  • WHEN 과 THEN은 다수가 존재할 수 있다.
  • ELSE가 존재하면 모든 조건에 해당하지 않는 경우에 반환 값을 설정할 수 있다.
  • ELSE가 존재하지 않고, 조건에 맞지 않아서 반환 값이 없으면 NULL을 반환한다.

 

CASE WHEN을 쓰는 두 가지 방법

1. switch 문

2. if 문

 

 

switch 문

  • value와 비교 대상이 같으면 then 뒤의 절을 반환
  • 만약 값이 서로 같지 않으면, else 절을 반환
  • 이때 else 절이 없으면, null 값을 반환

 

예시

SELECT nickname,
(
CASE nickname -- 여기서 value를 비교하는 것이기 때문에 case뒤에 비교 value가 온다.
	WHEN "pig" THEN "He likes pig"
	WHEN "dog" THEN "She likes dog"
	ELSE 'another nickname'
END
) AS TEST1
FROM users;

위의 예시를 해석하자면 pig 또는 dog가 닉네임인 유저는 test 칼럼에 "He likes pig" 또는 "She likes dog"가 들어갈 것이고, 이외의 다른 닉네임의 경우 "another nickname"이라는 것이 들어간다. 

또한 아예 닉네임이 없는 경우 null 값이 들어가게 된다.

 

 

기본 형식을 CASE ------- END 라고 생각하면 될 것 같다. (END를 넣어주는 이유는 값이 없을 때 NULL 값을 넣어줘야 하니깐)

WHEN 조건 THEN 반환 값 이렇게 통째로 같이 쓰인다.

 

 

if 문

  • WHEN 뒤의 condition의 논리 값이 참이면 THEN 절의 result 값을 반환한다.
  • 만약 논리 값이 거짓이라면, ELSE 절의 result 값을 반환한다. 이때 ELSE절이 없으면 NULL을 반환

 

기본 문법

CASE -- Value가 없이 바로 when이 나온다.
	WHEN [condition] THEN result
	WHEN [condition] THEN result
	ELSE result
END

 

예시

SELECT idx,
	(CASE 
		WHEN type = '1' THEN '의사'
		WHEN type = '2' THEN '검사'
		WHEN type = '3' THEN '변호사'
		ELSE '판사'
	END) AS prefer
FROM 사짜들의 모임;

TYPE 1 의사, TYPE 2 검사, TYPE 3 변호사 그 외엔 판사. 아무것도 없으면 NULL을 반환

 

 

 

 

다시 처음으로!


실수했던 부분을 고쳐보자

첫번째는 처음 작성했던 코드, 두 번째는 새로 고친 코드이다.

SELECT ANIMAL_ID, NAME, 
	(CASE WHEN SEX_UPON_INTAKE LIKE ('Neutered%' OR 'Spayed%')
	THEN 'O' ELSE 'X') AS 중성화
FROM ANIMAL_INS;
SELECT ANIMAL_ID, NAME, (CASE WHEN (SEX_UPON_INTAKE LIKE 'Neutered%') 
              OR (SEX_UPON_INTAKE LIKE 'Spayed%')
              THEN 'O' ELSE 'X' END) AS 중성화
FROM ANIMAL_INS;

1. LIKE 조건 때로 빼서 OR로 묶기

2. END 추가하기

 

 

 

Ref


 

 

[MySQL] CASE 기본 사용법

▶MySQL CASE 기본 사용법 ▶설명 MySQL에서 CASE문은 프로그래밍 언어에서 스위치(switch)문과 비슷하지만,다수의 조건에 하나의 반환 값은 동작하지 않습니다. ▶사용법 CASE WHEN 조건 THEN '반환 값' WHEN

extbrain.tistory.com

 

728x90
반응형
Comments