일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백엔드
- NVL
- 감정은 습관이다
- DecisionTree
- sorted
- 데이터 분석
- LAG
- 결정트리
- layer normalization
- 빠르게 실패하기
- recall
- five lines challenge
- Normalization
- 정밀도
- 평가 지표
- SQL
- 웹서비스 기획
- nvl2
- NULLIF
- 오차 행렬
- 비지도학습
- ifnull
- 재현율
- 데이터 프로젝트
- 강화학습
- CASE WHEN
- Batch Normalization
- beautifulsoup
- 지도학습
- 데이터 전처리
- Today
- Total
Day to_day
CASE WHEN 사용하기 본문
프로그래머스 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
'SQL' 카테고리의 다른 글
[MySQL] NOT IN을 사용할 때 주의할 점 (+ EXISTS와 비교하기) (0) | 2023.01.04 |
---|---|
[MySQL] 날짜 연산 DATE_ADD, DATE_SUB, DATEDIFF (+ LEAD, LAG) (0) | 2023.01.03 |
WITH 절 사용하기 (feat. PARTITION BY) (0) | 2022.11.04 |
재귀 쿼리 WITH RECURSIVE (0) | 2022.11.04 |
Null 치환하기 (0) | 2022.09.27 |