MSSQL / 앱버전 분기 쿼리

flobeeee·2024년 2월 14일
0

시행착오

목록 보기
42/45
post-thumbnail

1. 목적

특정 앱버전 이상인 기기에만 앱푸시를 보내야 한다.

2. 상황

string 데이터라서 제대로 비교가 안된다.
예를들어 3.10.2 버전이 3.3.1 버전보다 크다.

select '3.10.2' >= '3.3.1'; -- false가 나온다.

3. 쿼리

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 가 나온다. (오예!)      
      
     

4. 결과

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'))
      
profile
기록하는 백엔드 개발자

0개의 댓글