티스토리 뷰

IT/DB

[오라클]커스텀 정렬하기

Kanzler 2016. 11. 8. 07:00

오라클에서는 일반적으로 정렬을 하게 되는 경우 ASC(오름차순),DESC(내림차순)를 이용해서 데이터를 정렬을 합니다.

그런데 예외적으로 정령을 처리 해야 하는 경우가 생기게 됩니다. 가령 데이터에 월,화,수,목,금,토,일에 들어가 있다면 의도는 월~일까지 순서대로 정렬하고 싶은데, ASC(오름차순),DESC(내림차순)을 이용해서 정렬 하는 경우 원하는 정렬 결과가 나오지 않습니다. 이럴때 사용하는 것이 바로 커스텀 정렬입니다.


커스텀 정렬은 컬럼의 데이터를 가지고 오라클 내 정렬방법이 아니라 사용자가 직접 정렬순서를 설정할수 있도록 할 수 있도록 해주는 기능입니다. 임의의 테이블을 만들고 데이터를 INSERT 한 후에 특정 정렬순서에 따라 정렬하는 간단한 예제를 알아보도록 하겠습니다.


테이블 생성


1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE member(
no NUMBER PRIMARY KEY,
phone VARCHAR2 (16),
name VARCHAR2 (32)
week VARCHAR2 (6)
);
INSERT INTO member VALUES (100'010-1234-5678''홍길동','월요일');
INSERT INTO member VALUES (200'02-1234-5678''갑돌이','수요일');
INSERT INTO member VALUES (300'010-987-6543''아무개','금요일');
INSERT INTO member VALUES (400'031-123-5678''갑순이','화요일');
INSERT INTO member VALUES (500'052-1234-5678''철수','목요일');
INSERT INTO member VALUES (600'001-987-6543''영희','토요일');
INSERT INTO member VALUES (700'063-123-6543''철희','일요일');
cs


일반 정렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT * FROM member ORDER BY WEEK
 
 
/**
실행 결과
NO     PHONE           NAME     WEEK
300    010-987-6543    아무개    금요일
500    052-1234-5678   철수      목요일
200    02-1234-5678    갑돌이    수요일
100    010-1234-5678   홍길동    월요일
700    063-123-6543    철희      일요일
600    001-987-6543    영희      토요일
400    031-123-5678    갑순이    화요일
**/
cs


커스텀 정렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT * FROM member
ORDER BY CASE
WHEN WEEK='일요일' THEN 1
WHEN WEEK='월요일' THEN 2
WHEN WEEK='화요일' THEN 3
WHEN WEEK='수요일' THEN 4
WHEN WEEK='목요일' THEN 5
WHEN WEEK='금요일' THEN 6
WHEN WEEK='토요일' THEN 7
ELSE 99
END ASC
 
/**
실행 결과
NO    PHONE         NAME    WEEK
700   063-123-6543   철희    일요일
100   010-1234-5678  홍길동  월요일
400   031-123-5678   갑순이  화요일
200   02-1234-5678   갑돌이  수요일
500   052-1234-5678  철수    목요일
300   010-987-6543   아무개  금요일
600   001-987-6543   영희    토요일
**/
cs


사용자 입맛에 맞게 특정 컬럼에 데이터값에 따라 정렬순서를 임의로 설정하여 정렬처리 할 수 있습니다.
각각의 상황에 맞게 커스터마이징 해서 사용 하시면 될것 같습니다.



댓글