녕녀기의 실험일지

[ Oracle ] ORDER BY + CASE를 사용해 조건에 따른 정렬 순서 정하기 본문

-- 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은 가장 큰 값으로 취급돼 아래 행에 출력됩니다.

fig 1. 결과 일부

 

그 후 NULL인 아이들의 등급이 동일할 때는 점수 순(S.MARKS)으로 오름차순 정렬됩니다.

 

 

 

ORDER BY (CASE WHEN A='a' THEN 1 ELSE 2 END)에는 조건에 따라 순서를 정해줄 수도 있기 때문에,

 

정렬에 조건을 붙이기 용이합니다.


사실 저렇게 할 수 있다는 것을 안 후,

 

이것저것 시도해 보다가 안 돼서

 

다른 사람의 쿼리문을 슬쩍 봤습니다ㅎㅎ

 

(감사합니다. 인도인 개발자분❤️)

 

그럼 저는 슬슬 다른 것을 준비해 보러 갈게요~~

 

누군가에게는 도움이 되길!

 

(사실 저한테 제일 도움이 됩니다ㅋㅋ)

 

 

 

뿅!

Comments