-- Data --/- SQL -
[ Oracle ] ORDER BY + CASE를 사용해 조건에 따른 정렬 순서 정하기
녕녀기
2024. 2. 27. 11:18
본문으로
안녕하세요. 녀기입니다.
아 너무 졸려요.
연습이랑 포스팅도 거의 졸면서 하고 있습니다.
(출퇴근 4시간은 너무 빡센 것.....)
그래도 해야지 어쩌겠습니까 인생.
오늘은 order by에도 case를 설정할 수 있다는 것을 알고
나중에 안 까먹으려고 포스팅합니다.
바로 들어가시죠~
어우 졸려....
ORDER BY + CASE
select case when g.grade <= 7 then null else s.name end
, g.grade, s.marks
from students s inner join grades g
on s.marks >= g.min_mark and s.marks <= g.max_mark
order by g.grade desc,
(case when g.grade > 7 then s.name else null end),
s.marks asc
위 문제는 학생들의 점수로 등급을 나누고,
8등급 미만의 학생들의 이름은 NULL로 표시하며,
등급에 따라 정렬을 다르게 해야 하는 것이었습니다.
정렬 조건은 아래와 같이
- 첫 번째로 등급 별로 내림차순 정렬
- 학생 등급이 8등급 이상일 때 등급이 동일하다면, 알파벳 순으로 정렬
- 학생 등급이 8등급 미만일 때 등급이 동일하다면, 점수 순으로 오름차순 정렬
이었습니다.
코드 블럭에 있는 CASE 문을 살펴보면
등급(G.GRADE)이 7보다 크면 이름 순(알파벳 순, S.NAME)으로 정렬하고,
아닐 때는 NULL로 정렬합니다.
ORACLE에서 NULL은 가장 큰 값으로 취급돼 아래 행에 출력됩니다.
그 후 NULL인 아이들의 등급이 동일할 때는 점수 순(S.MARKS)으로 오름차순 정렬됩니다.
ORDER BY (CASE WHEN A='a' THEN 1 ELSE 2 END)에는 조건에 따라 순서를 정해줄 수도 있기 때문에,
정렬에 조건을 붙이기 용이합니다.
사실 저렇게 할 수 있다는 것을 안 후,
이것저것 시도해 보다가 안 돼서
다른 사람의 쿼리문을 슬쩍 봤습니다ㅎㅎ
(감사합니다. 인도인 개발자분❤️)
그럼 저는 슬슬 다른 것을 준비해 보러 갈게요~~
누군가에게는 도움이 되길!
(사실 저한테 제일 도움이 됩니다ㅋㅋ)
뿅!
