특정 앱버전 이상인 기기에만 앱푸시를 보내야 한다.
string 데이터라서 제대로 비교가 안된다.
예를들어 3.10.2 버전이 3.3.1 버전보다 크다.
select '3.10.2' >= '3.3.1'; -- false가 나온다.
select SUBSTRING_INDEX('3.10.2', '.', 1)
, SUBSTRING_INDEX('3.10.2', '.', 2)
, SUBSTRING_INDEX('3.10.2', '.', 3);
-- 3, 3.10, 3.10.2 가 조회된다.
select SUBSTRING_INDEX('3.10.2', '.', 1)
, SUBSTRING_INDEX(SUBSTRING_INDEX('3.10.2', '.', -2), '.', 1)
, SUBSTRING_INDEX('3.10.2', '.', -1);
-- 3, 10, 2 가 조회된다.
그럼 3, 10, 2 따로 뽑고 3, 3, 1 따로 뽑아서 비교할건가?
LPAD를 통해 일정자리수를 맞춰서 비교하는 방법을 사용했다.
select SUBSTRING_INDEX('3.10.2', '.', 1),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX('3.10.2', '.', -2), '.', 1), 5, '0'),
LPAD(SUBSTRING_INDEX('3.10.2', '.', -1), 5, '0');
-- 3, 00010, 00002
동료 앱개발자에게 물어보니
n.m.l <- 형식으로 버전을 표현하는데
큰 리뉴얼인 경우 n 을 더하고
새로운 기능이 추가되면 m을 더하고
자잘한 수정이 들어간 경우 l의 숫자를 더한다고 한다.
그래서 넉넉하게 5자리로 잡았다.
select concat(SUBSTRING_INDEX('3.10.2', '.', 1)
, LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX('3.10.2', '.', -2), '.', 1), 5, '0')
, LPAD(SUBSTRING_INDEX('3.10.2', '.', -1), 5, '0'));
-- 30001000002 (3.10.2를 변환한 숫자이다.)
select concat(SUBSTRING_INDEX('3.3.1', '.', 1)
, LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX('3.3.1', '.', -2), '.', 1), 5, '0')
, LPAD(SUBSTRING_INDEX('3.3.1', '.', -1), 5, '0'));
-- 30000300001 (3.3.1을 변환한 숫자이다.)
select concat(SUBSTRING_INDEX('3.10.2', '.', 1)
, LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX('3.10.2', '.', -2), '.', 1), 5, '0')
, LPAD(SUBSTRING_INDEX('3.10.2', '.', -1), 5, '0'))
> concat(3, LPAD(3, 5, '0'), LPAD(1, 5, '0'));
-- true 가 나온다. (오예!)
3.3.1보다 같거나 높은 앱버전을 사용하는 유저를 조회
SELECT *
FROM user_device_info
WHERE CONCAT(SUBSTRING_INDEX(app_version, '.', 1)
, LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(app_version, '.', -2), '.', 1), 5, '0')
, LPAD(SUBSTRING_INDEX(app_version, '.', -1), 5, '0'))
>= CONCAT(3, LPAD(3, 5, '0'), LPAD(1, 5, '0'))