언어

join on 다중 조건 & cast type 실험

땅호720 2023. 12. 13. 16:16

join on 다음에 키 컬럼을 매칭 시켜주는 것 외에도 조건을 걸 수 있다는 사실을 아셨습니까

 

그리고 컬럼에서 문자열이 숫자로 시작하면 (ex: 7일 이상), unsigned 타입으로 cast해줬을 때 숫자만 필터링된다!

숫자형 데이터 타입에서는 소수형(FLOAT, DECIMAL, DOUBLE)으로 cast해주었을 때 숫자로 출력이 되었다. (정수형 오류발생)

 

- unsigned: 양수만을 사용할 때, 양수로 더 넓은 범위를 갖고 싶을 때 지정해줌

( int: -214... ~ 214... -> unsigned 지정 시 0 ~ 429...로 범위 확장 가능)

SELECT HISTORY_ID,
        round(daily_fee * (100 - if(discount_rate is null, 0, discount_rate)) / 100 * (datediff(END_DATE, START_DATE) + 1)) FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
inner join CAR_RENTAL_COMPANY_CAR c
on c.CAR_ID = h.CAR_ID
left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
on c.CAR_TYPE=p.CAR_TYPE 
	and datediff(END_DATE, START_DATE) + 1 >= CAST(p.DURATION_TYPE AS DECIMAL)
where c.car_type='트럭'
group by HISTORY_ID
order by FEE desc, HISTORY_ID desc

 

플랜 테이블을 조인해줄 때, car_type이 일치하는 케이스 대여기간이 duration_type에서 나뉘는 기간 이상인 데이터(row)를 묶어준다.

이 의미는, 대여기간이 10일인 경우에 duration_type이 '7일 이상'인 케이스가 조건에 부합한다.

 

대여기간이 100일이 넘는 경우, duration_type '7일/30일/90일 이상'인 모든 케이스가 조건에 부합하므로 가장 마지막에 True를 반환한 '90일 이상'인 데이터가 출력된 것으로 추측된다. (플랜 테이블이 7 -> 30 -> 90일 순으로 구성되어 있다)

plan_id car_type duration_type discount_rate
1 세단 7일 이상 5
2 세단 30일 이상 8
3 세단 90일 이상 12
4 SUV 7일 이상 3
5 SUV 30일 이상 5
6 SUV 90일 이상 10

 

 

[참고]

- stack overflow: MySQL string cast to unsigned

- mysql data type