DB

[DB][Oracle] 동적으로 정렬이 바뀔 때 행 번호 매기기 (ROWNUM, ROW_NUMBER())

오선지♬ 2025. 5. 19. 19:51
728x90
반응형

✅ 방법 1: SQL에서 여러 정렬 기준을 동적으로 설정 (CASE WHEN 사용)

SELECT 
	ROW_NUMBER() OVER ( 
    	ORDER BY 
        	CASE WHEN :sort_col = 'emp_id' THEN emp_id END
            , CASE WHEN :sort_col = 'emp_name' THEN emp_name END
            , CASE WHEN :sort_col = 'salary' THEN salary END ) AS RN
    , emp_id
    , emp_name
    , salary 
FROM employees;
  • :sort_col은 바인딩 변수 (예: 'emp_id', 'emp_name', 'salary')
  • 정렬 기준을 바꾸면 그에 따라 RN 값도 바뀜.

✅ 방법 2: 애플리케이션에서 정렬 컬럼을 지정해서 쿼리 조합

프로그래밍 언어나 MyBatis, JPA 같은 프레임워크에서 아래처럼 쿼리를 동적으로 구성:

SELECT 
	ROW_NUMBER() OVER (ORDER BY ${sortCol} ${sortDir}) AS RN
    , emp_id
    , emp_name
    , salary 
FROM employees
 
  • ${sortCol} → "emp_id", "salary" 등
  • ${sortDir} → "ASC" 또는 "DESC"

⚠️ SQL Injection에 주의해서 사전에 허용된 컬럼명/정렬방식만 허용하도록 처리해야 합니다.


✅ 방법 3: 서브쿼리로 감싸서 ROWNUM 사용 (정렬 결과 후 번호 부여)

SELECT 
	ROWNUM AS RN
    , t.* 
FROM ( SELECT emp_id, emp_name, salary FROM employees ORDER BY emp_name ) t;
 
  • 이 방식은 정렬 후 ROWNUM을 부여하지만, 정렬 기준을 동적으로 바꾸려면 서브쿼리 전체를 동적으로 만들어야 해서 불편합니다.
  • 그래서 ROW_NUMBER() + 동적 ORDER BY 조합이 더 유연합니다.
728x90
반응형