본문 바로가기
Language/DB

[Programmers | SQL | String, Date 문제 풀이] 중성화 여부 파악하기 - Solution with IF문 또는 CASE WHEN문

by ㅇ달빛천사ㅇ 2024. 6. 18.
728x90

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;


  • 2) IF문 이용하기

    왠지 모르겠지만 이 쿼리를 MySQL만 실행 됨.


  • 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;
    
    실행 결과

💬 무엇을 새롭게 알았는지

문제를 잘 읽고 조건을 파악하여 코드 작성에 실수가 없도록 하자.
IF()문, CASE WHER문을 사용해 보았다.


📚 References(참고 자료)

728x90


Top