Leeyebin의 블로그
[ORACLE]우선순위 지정해서 ORDER BY 하기 본문
보통 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 절에 사용가능하니 조건에 맞는 정렬을 할 수 있다.
'프로그래밍 > SQL' 카테고리의 다른 글
[ORACLE] COMMIT 후 TIMESTAMP 이용하여 복구하는 방법 (0) | 2017.03.06 |
---|---|
[DB2]파라미터값을 임시로 테이블인 것처럼 사용하기 (0) | 2016.09.06 |
[ORACLE] MERGE INTO (0) | 2016.03.09 |