MySQL 프로시저 변수값에 따른 where 및 order by 변경

개요

MySQL 프로시저내에서 인수로 전달받은 값에 따라 where 및 order by 부분을 달리하고 싶은 경우가 있습니다. Dynamic SQL로 가능하지만 이 글에서는 case 문을 이용한 방법을 살펴보겠습니다.

where 절

프로시저의 인수로 전달받은 값에 따라 where 절의 조건을 변경하는 방법입니다. 회사ID 가 0이면 모든 회사를 보여주고 회사ID가 0 보다 크면 해당하는 자료만 보여주는 쿼리를 보겠습니다. _company_id 가 인수로 전달받은 변수입니다.

select
    *
from
    company
where
    1 = 1
    and case when _company_id > 0 then company_id = _company_id else 1 = 1 end

7행을 보면 and 뒤쪽에 case 문을 이용해서 조건을 변경한 것을 알 수 있습니다.

order by

프로시저 인수로 특정한 필드의 정렬 조건을 넘겨받는 경우가 있습니다. 토글 형태로 오름차순과 내림차순이 번갈아 가면서 order by 부분에 적용되어야 합니다. 정렬을 적용해야 하는 필드가 적으면 조건으로 나누어 처리할 수 있습니다. 하지만 필드의 개수가 많아지면 조건으로 나누어 작업하는 것이 조합이 많아지게 되어 불가능 합니다. where 절과 마찬가지로 case 문을 이용해서 order by 부분의 필드와 정렬기준을 변경할 수 있습니다.

회사이름과 직원수 필드로 정렬하는 쿼리문을 예로 들어보겠습니다. _company_name_sort_order, _employee_sort_order 가 인수로 전달받은 변수입니다.

select
    *
from
    company
where
    company_id > 0
order by
    case when lower(_company_name_sort_order) = 'a' then company_name end asc
    , case when lower(_company_name_sort_order) = 'd' then company_name end desc
    , case when lower(_employee_sort_order) = 'a' then employee end asc
    , case when lower(_employee_sort_order) = 'd' then employee end desc

8-11행을 보면 case 문으로 전달된 변수의 값으로 정렬기준을 변경한 것을 알 수 있습니다. 쿼리문이 이상하게 보이는 것 같지만 이런 방식으로 프로시저의 크기를 줄일 수 있습니다.

이상으로 MySQL 프로시저 변수값에 따른 where 및 order by 변경 방법에 대해 알아보았습니다.

이케아 아스크볼(ASKVOLL) 침대프레임

이케아 아스크볼(ASKVOLL) 침대프레임 제품 선택은 순전히 개인의 상황과 취향에 따른 것 입니다.
별도의 지원을 받은 사실이 없습니다.

구매동기

근래에 옆으로 누우면 옆쪽이 바닥에 닿는 느낌이 들어 침대를 구매해야 겠다는 생각이 들었습니다. 매트리스는 휠레스타드(HYLLESTAD)로 결정했고 그것을 올려놓을 침대프레임을 선택해야 했습니다. 여러가지 종류가 있었는데 심플하고 깔끔한 이케아 아스크볼(ASKVOLL) 침대프레임 을 선택했습니다.

구입

대략적인 크기와 무게는 웹사이트에서 확인했지만 실제 어느 정도인지 감이 오지 않았습니다. 매장에 가서 확인해 보았습니다.

침대헤드, 발쪽 판이 하나의 상자, 옆판 두개가 하나의 상자로 포장되어 있었습니다. 셀프픽업 위치도 달랐습니다.

체중이 많이 나가지는 않지만 안정감을 주기위해 침대갈빗살 루뢰위(LURÖY) 도 같이 구입했습니다. 이 세가지가 하나의 세트형식으로 판매되고 있었습니다. 쇼룸에서 안내되어 있는 위치를 사진으로 찍어 셀프픽업 했습니다.

들어보니 생각보다 무거웠습니다. 둘이서 안정적으로 들어서 픽업을 하는 것이 좋을 것 같습니다. 다른 구매제품과 같이 실을 수가 없어서 카트를 두개를 썼습니다.

매트리스는 매장에서 계산 후 물건을 받는 곳에서 받으면 됩니다. 받고 난 후 침대프레임과 매트리스를 당일배송으로 의뢰했습니다. 매장이 거주하고 있는 곳에 있어서 가능한 것 같습니다. 배송비용은 49,000원 입니다.

조립 및 사용

배송을 받고 보니 매장에서 보던 것보다 더 크게 느껴졌습니다.

휠레스타드(HYLLESTAD) 120x200cm
휠레스타드(HYLLESTAD) 120x200cm
아스크볼(ASKVOLL) 침대프레임 옆판
아스크볼(ASKVOLL) 침대프레임 옆판
아스크볼(ASKVOLL) 침대프레임 헤드
아스크볼(ASKVOLL) 침대프레임 헤드
침대 갈빗살

집에 들여 놓으니 생각보다 커서 당황했습니다. 무게도 상당해서 어떻게 조립해야 할지 조금 걱정되었습니다. 먼저 침대프레임 헤드 상자를 개봉했습니다. 안쪽이 어떻게 포장되어 있지 몰라서 칼을 사용하지 않고 뜯었습니다. 단단하게 포장되어 있어 이것도 꽤 힘들었습니다.

개봉해 보니 발쪽 판이 먼저 보입니다. 침대를 놓을 방으로 옮겨놓았습니다. 침대프레임 헤드도 옮겼습니다. 옆판은 길어서 조심해서 옮겼는데 방이 좁다보니 헤드 부분이 조금 닿아 찍혔습니다(으… 속쓰려…). 조심해서 운반했지만 앞쪽 유리창에 신경을 쓰다보니 그렇게 되었습니다. 혼자서 조립하시는 분들 조심하시기 바랍니다.

침대프레임 발쪽 판
침대프레임 발쪽 판
침대프레임 헤드
침대프레임 헤드
철제 부속품과 조립설명서
부속품과 조립설명서

부속품 개수를 확인하고 조립설명서를 참고하여 조립을 시작했습니다. 부피도 크고 무게도 있어서 혼자서 하려면 꽤 힘듭니다. 두분 이상이 조립하는 것을 강력추천합니다.

침대프레임 헤드, 발판 부속품 끼운 모습
침대프레임 헤드, 발판 부속품 끼운 모습
침대프레임 옆판 안쪽 부속품 장착모습
침대프레임 옆판 안쪽 부속품 장착모습

헤드, 발판, 옆판 두개를 연결해서 모양을 잡고 안쪽 동그란 부속품을 조이면 기본 틀은 완성됩니다. 이 작업이 도와주는 사람이 없으면 힘듭니다.

동그란 부속품을 조일때는 연결부분이 많이 떨어져 있지 않아야 합니다. 어느 정도 붙어있어야 도구를 이용해서 돌렸을 때 힘을 받아 꽉 조여집니다. 만일 헛도는 느낌이 있으면 사이를 더 좁힌 후 돌려보시기 바랍니다.

헤드, 발판, 옆판을 연결한 모양
헤드, 발판, 옆판을 연결한 모양

모두 조여서 빈틈이 없도록 침대프레임을 완성합니다. 위의 사진에서 보면 옆판 안쪽에 구멍이 세개씩 있습니다. 긴 철제빔의 위치입니다. 올려놓으실 매트리스 높이에 따라서 조정하시면 됩니다. 빔을 고정하고 갈빗살을 깔면 완성됩니다.

갈빗살을 깔아 침대프레임을 완성한 모습
갈빗살을 깔아 침대프레임을 완성한 모습

침대프레임에 매트리스를 올리면 모든 작업이 마무리 됩니다.

침대프레임 위에 매트리스를 올린 모습
침대프레임 위에 매트리스를 올린 모습

침대를 사용하니 처음에는 어색했는데 금방 익숙해졌습니다. 몸을 움직일 때 가끔 아래 갈빗살 때문인지 나무의 삐걱거리는 소리가 나는데 신경쓰일 정도는 아니였습니다.

매트리스도 냄새가 좀 나지 않을까 걱정했는데 거의 없었습니다. 침대프레임 조립이 조금 힘들었습니다. 하지만 저렴하게 침대를 잘 마련한 것 같아 기분이 좋았습니다.

제품정보는 아래에서 확인하실 수 있습니다.

아스크볼(ASKVOLL) 침대프레임

루뢰위(LURÖY) 침대갈빗살

휠레스타드(HYLLESTAD) 포켓스프링매트리스