KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | SQL CODEKATA
🚻 중성화 여부 파악하기
🏷 관련 주제 : IF CASE WHEN
문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
| NAME | TYPE | NULLABLE |
|---|---|---|
| ANIMAL_ID | VARCHAR(N) | FALSE |
| ANIMAL_TYPE | VARCHAR(N) | FALSE |
| DATETIME | DATETIME | FALSE |
| INTAKE_CONDITION | VARCHAR(N) | FALSE |
| NAME | VARCHAR(N) | TRUE |
| SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
| ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
|---|---|---|---|---|---|
| A355753 | Dog | 2015-09-10 13:14:00 | Normal | Elijah | Neutered Male |
| A373219 | Cat | 2014-07-29 11:43:00 | Normal | Ella | Spayed Female |
| A382192 | Dog | 2015-03-13 13:14:00 | Normal | Maxwell 2 | Intact Male |
중성화한 동물: Elijah, Ella
중성화하지 않은 동물: Maxwell 2
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.ANIMAL_ID NAME 중성화 A355753 Elijah O A373219 Ella O A382192 Maxwell 2 X ※ 컬럼 이름은 일치하지 않아도 됩니다.
본 문제는 [Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"](https://www.kaggle.com/datasets/aaronschlegel/austin-animal-center-shelter-intakes-and-outcomes)에서 제공하는 데이터를 사용하였으며 [ODbL](https://opendatacommons.org/licenses/odbl/1-0/)의 적용을 받습니다.
✔ (Oracle & MySQL) Solution with CASE WHEN STATEMENT
SELECT ANIMAL_ID,
NAME,
CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
ELSE 'X'
END AS "중성화"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
실행 결과

CASE WHEN에서 결과로 출력할 값이 같으면 하나로 묶어서 적을 수 있을 것 같아서 OR 조건으로 묶어서 쿼리를 작성해 보았다.
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
ORDER BY ANIMAL_ID;
✔ (MySQL) Solution with IF STATEMENT
SELECT ANIMAL_ID
, NAME
, IF(SEX_UPON_INTAKE LIKE 'Neutered%'
OR SEX_UPON_INTAKE LIKE 'Spayed%', 'O' , 'X') "중성화"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
실행 결과

💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍
📌 오늘 만난 문제 : 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다.
동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요.
이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
1. 동물의 아이디와 이름, 중성화 여부 조회하기
MySQL & Oracle
SELECT ANIMAL_ID , NAME , SEX_UPON_INTAKE FROM ANIMAL_INS;실행 결과

2. 위의 조회 결과에서 중성화 여부칼럼의 데이터를 'Neutered' 또는 'Spayed'라는 단어를 포함하면 'O', 아니라면 'X'로 출력하자.
IF() 또는 CASE WHEN문을 사용할 수 있다.
MySQL & Oracle
1) CASE WHEN구문 이용하기
SELECT ANIMAL_ID , NAME , CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O' WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O' ELSE 'X' END AS "중성화" FROM ANIMAL_INS;실행 결과

2) IF문 이용하기
왠지 모르겠지만 이 쿼리를 MySQL만 실행 됨.
SELECT ANIMAL_ID , NAME , IF((SEX_UPON_INTAKE LIKE 'Neutered%') OR (SEX_UPON_INTAKE LIKE 'Spayed%'), 'O' , 'X') "중성화" FROM ANIMAL_INS;실행 결과

3. 위의 조회 결과를 ID로 정렬하자.
MySQL & Oracle
1) CASE WHEN구문 이용하기
SELECT ANIMAL_ID , NAME , CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O' WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O' ELSE 'X' END AS "중성화" FROM ANIMAL_INS;MySQL
SELECT ANIMAL_ID , NAME , IF((SEX_UPON_INTAKE LIKE 'Neutered%') OR (SEX_UPON_INTAKE LIKE 'Spayed%'), 'O' , 'X') "중성화" FROM ANIMAL_INS ORDER BY ANIMAL_ID;실행 결과

2) IF문 이용하기
왠지 모르겠지만 이 쿼리를 MySQL만 실행 됨.
💬 무엇을 새롭게 알았는지
문제를 잘 읽고 조건을 파악하여 코드 작성에 실수가 없도록 하자.IF()문, CASE WHER문을 사용해 보았다.