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
반응형
'DB' 카테고리의 다른 글
[DB][Oracle] 공백과 Null 모두 제외하기 (0) | 2025.06.17 |
---|---|
[DB][MySQL] ROW_NUMBER()와 WITH (CTE)를 사용할 때 성능 차이 (0) | 2025.05.26 |
[DB][Oracle] ROWNUM / ROW_NUMBER() (0) | 2025.05.18 |
[DB] LISTAGG / STRING_AGG (0) | 2025.05.16 |
[DB][Oracle] LISTAGG (0) | 2025.05.15 |