Leeyebin의 블로그

[ORACLE]우선순위 지정해서 ORDER BY 하기 본문

프로그래밍/SQL

[ORACLE]우선순위 지정해서 ORDER BY 하기

안되면될때까지 2017. 1. 6. 00:53

보통 DB에서 정렬을 하는 방법이라고하면 ORDER BY가 떠오른다.


내가 만든 도움말 관리 화면에서 조회할 때  도움말 번호에 따라 언어셋(예: 베트남이라면 한국어, 영어, 베트남어)  한벌이 나오게 되는데 일반적으로  ORDER BY 를 이름으로 준다면 

SEQ(순번)

 GLB_LANG_CD(언어코드)  HELP_TXT(도움말 내용)

 1

EN 

 HELLO

 1

KO  안녕

 1

VI  Xin chào

 2

EN 

 NICE TO MEET YOU.

 2

KO 

 반갑습니다.

 2

VI  Hân hạnh được gặp bạn.


이런식으로 나오게 되는데 추가 요청사항으로 어떤 언어셋이 나오더라도 한국어(KO)를 한 쌍에서 최우선순위로 두고 나머지는 알파벳 순서로 해달라는 요청이 있었다. 처음에는 어떻게 할까 고민을 하다가 대리님께 여쭤보니 컨트롤러에서 제어하는 방식을 말씀하셨는데 쿼리에서 해결해보고자하는 생각이 있었던 것 같다.


원하는 결과

SEQ(순번)

 GLB_LANG_CD(언어코드) //KO를 최우선순위, 나머지는 알파벳순

 HELP_TXT(도움말 내용)

 1

KO

 안녕

 1

EN

 HELLO

 1

VI  Xin chào

 2

KO

 반갑습니다.

 2

EN

 NICE TO MEET YOU.

 2

VI  Hân hạnh được gặp bạn.




구글에서 정보를 찾아보았더니 소팅시 어떤 값인 경우 우선순위를 두고 나머지 정렬하는 방법들이 여러가지가 나왔다. 그중에 적용하기 비교적 간단한 방법을 적는다. ORDER BY 절에 CASE WHEN ~ THEN을 사용하는 것이다.


기존의 쿼리는 이런데

SELECT
    SEQ
    ,GLB_LANG_CD
    ,HELP_TXT
FROM HELP00
ORDER BY SEQ, GLB_LANG_CD


순번(SEQ)순으로 그다음에는 언어코드(GLB_LANG_CD)순으로 ORDER BY가 걸린다.



바꾼 쿼리는 이렇다.

SELECT
    SEQ
    ,GLB_LANG_CD
    ,HELP_TXT
FROM HELP00
ORDER BY SEQ, CASE WHEN GLB_LANG_CD IN ('KO') THEN 0 ELSE 1 END, GLB_LANG_CD


순번(SEQ)순으로 그다음에는 언어코드(GLB_LANG_CD) 안에 'KO'가 있으면 0을주고, 'KO'이 아니라면 1을준다.(이렇게 하면 KO가 0으로써 우선순위가 다른 코드보다 제일 높게 되고, 이후에 언어코드(GLB_LANG_CD)로 소팅이 되면 나머지 언어가 알파벳 순서로 소팅이 된다.)


추가로 CASE WHEN이니 소팅하려는 칼럼의 속성에 따라 조건을 걸어주면된다.

상황에 따라 DECODE문도 ORDER BY 절에 사용가능하니 조건에 맞는 정렬을 할 수 있다.

Comments