반응형

[ 처음 작성했던 코드 ]
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) 로 변환을 해준 후에 전환해주는 것이 좋음.
- 의도가 명확하게 보임.
- 정확한 판별이 가능함.
- DBMS 범용성이 높아짐.
- Oracle 등 Boolean 타입이 없는 DBMS에서도 사용 가능.
- 확장성과 유지보수성이 좋음.
- 다른 상태 조건에서도 CASE WHEN 내부만 수정하여 사용하면 됨.
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] A 강조하기 (JAVA/ 자바) (5) | 2025.07.26 |
|---|---|
| [프로그래머스] ad 제거하기 (JAVA/ 자바) (2) | 2025.07.24 |
| [프로그래머스] 입양 시각 구하기(2) (MySQL) (1) | 2025.05.12 |
| [프로그래머스] 약수의 개수와 덧셈 (JAVA/ 자바) (1) | 2025.04.01 |
| [프로그래머스] 수박수박수박수박수박수? (JAVA/ 자바) (2) | 2025.03.30 |