본문 바로가기
알고리즘/프로그래머스

[프로그래머스] 자동차 대여 기록에서 대여중/ 대여 가능 여부 구분하기 (MySQL)

by pandastic 2025. 5. 18.
반응형

 

 

[ 처음 작성했던 코드 ]

SELECT CAR_ID,
    CASE WHEN END_DATE < '2022-10-16' THEN '대여 가능'
         WHEN END_DATE >='2022-10-16' THEN '대여중'
END AVAILABILITY,
END_DATE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

이 코드는 한 자동차에 기록이 여러 개 있을 때 가장 최근 것이 나오지 않는다. 그래서 조건에 맞지 않게 된다.

 

 

[ 내가 작성한 코드 ]

SELECT CAR_ID,
       CASE WHEN MAX(START_DATE <='2022-10-16' AND END_DATE >= '2022-10-16') THEN '대여중'
       ELSE '대여 가능'
       END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
  • MySQL에서는 정확히 실행되지만 Oracle 등 다른 DBMS 에서는 오류가 발생할 수 있음.
    • Oracle에는 Boolean 타입이 존재하지 않기 때문.
    • MySQL이 MAX(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16') 구문을 자동으로 1(TRUE), 0(FALSE)로 암시적 변환을 했기 때문에 정상적으로 동작했던 것.

 

[ 모범 답안 ]

SELECT CAR_ID, 
     CASE WHEN MAX(CASE WHEN 
                   START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16' THEN 1
          ELSE 0
          END) = 1
   THEN '대여중'
   ELSE '대여 가능'
   END AS AVAILABILITY                 
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
  • 아래와 같이 명시적으로 1(TRUE), 0(FALSE) 로 변환을 해준 후에 전환해주는 것이 좋음.
    1. 의도가 명확하게 보임.
    2. 정확한 판별이 가능함.
    3. DBMS 범용성이 높아짐.
      • Oracle 등 Boolean 타입이 없는 DBMS에서도 사용 가능.
    4. 확장성과 유지보수성이 좋음.
      • 다른 상태 조건에서도 CASE WHEN 내부만 수정하여 사용하면 됨.
반응형